Russian Qt Forum
Апрель 25, 2024, 08:31 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Вопрос по UI и не только  (Прочитано 2999 раз)
makar182
Гость
« : Август 29, 2014, 17:37 »

Доброго времени суток,

Помогите с двумя вопросами, пожалуйста.
1) Обычно, если одна форма UI в проекте, то обращение к её элементам проходит как ui->(object name). А что, если в проекте (Проект по чтению таблиц типа Excel) вложены несколько классов типа QDialog, которые имеют несколько своих форм UI - как обращаться к их элементам?
2)Как ликвидировать ошибку "binding of reference to type 'QString' to a value of type 'const QString' drops qualifiers..." (ругается на самую первую строчку с 'if')
Код:
bool MainWindow::loadFile(const QString &filename)
{
    if (!spreadsheet->readFile(filename))
    {
        statusBar()->showMessage(tr("Load canceled"), 2000);
        return false;
    }

    setCurrentFile(filename);
    statusBar()->showMessage(tr("Load finished"), 2000);
    return true;
}
« Последнее редактирование: Август 29, 2014, 17:49 от makar182 » Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3258


Просмотр профиля
« Ответ #1 : Август 30, 2014, 11:52 »

вангую, что readFile принимает неконстантную ссылку
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #2 : Август 30, 2014, 12:52 »

1) dialog->ui->(object name), хотя желательно такого кода избегать и использовать сигналы/слоты
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
makar182
Гость
« Ответ #3 : Сентябрь 01, 2014, 08:41 »

1) dialog->ui->(object name), хотя желательно такого кода избегать и использовать сигналы/слоты

Понял. А в случае слот/сигналов, обращение к виджетам, реализованным в ui, также по схеме dialog->ui->(object name)?
P.S.: Здесь dialog это имя главного виджета в .ui?

Записан
Bepec
Гость
« Ответ #4 : Сентябрь 01, 2014, 10:07 »

Схема простая:
(Указатель на главный виджет(окно) )->ui->(указатель на виджет к которому обращаемся)->(метод виджета).
dialog->ui->lineEdit->setText

В сигнал- слотах нужен указатель на виджет, так что обрезаем метод.

Но такой код не рекомендуется. Он ненадёжен и в нём имеются подводные камни.
« Последнее редактирование: Сентябрь 01, 2014, 10:08 от Bepec » Записан
8Observer8
Гость
« Ответ #5 : Сентябрь 02, 2014, 11:24 »

Понял. А в случае слот/сигналов, обращение к виджетам, реализованным в ui, также по схеме dialog->ui->(object name)?
P.S.: Здесь dialog это имя главного виджета в .ui?

Допустим у нас есть MainWindow, а на нём кнопка (или пункт меню). При нажатии на кнопку вызывается диалоговое окно. На диалоговом окне есть поля ввода и кнопка Ok. Чтобы получить данные с этого диалогового окна надо в нём сделать отправку сигнала с введёнными данными (emit). А в MainWindow сделать слот для принятия данных. И соединить сигнал с диалогового окна и слот для принятия данных.

Вот как это примерно выглядит:

Создаём диалог с кнопкой и полем ввода. При нажатии на кнопку диалог отправляет сигнал (emit):
Код
C++ (Qt)
void SettingsDialog::on_okButton_clicked()
{
   QString portName = ui->portNameComboBox->currentText();
   QString portSpeed = ui->portSpeedComboBox->currentText();
   emit signalSetSettings( portName, portSpeed );
   this->close();
}
 

В MainWindow создаём слот для принятия данных:
Код
C++ (Qt)
void MainWindow::slotSetSettings( const QString &portName,
                                 const QString &portSpeed )
{
   // ... делаем что-то с данными от диалога
}
 

При нажатии подпункта MainWindow в меню вызываем диалог и связываем сигнал и слот, описанные выше:
Код
C++ (Qt)
void MainWindow::on_actionSettengs_triggered()
{
   SettingsDialog dialog;
   dialog.setModal( true );
   connect( &dialog, SIGNAL( signalSetSettings( QString,QString ) ),
            this, SLOT( slotSetSettings(QString,QString ) ) );
   dialog.exec();
}
 
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.101 секунд. Запросов: 23.