Russian Qt Forum

Qt => Вопросы новичков => Тема начата: makar182 от Август 29, 2014, 17:37



Название: Вопрос по UI и не только
Отправлено: 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;
}


Название: Re: Вопрос по UI и не только
Отправлено: Авварон от Август 30, 2014, 11:52
вангую, что readFile принимает неконстантную ссылку


Название: Re: Вопрос по UI и не только
Отправлено: kambala от Август 30, 2014, 12:52
1) dialog->ui->(object name), хотя желательно такого кода избегать и использовать сигналы/слоты


Название: Re: Вопрос по UI и не только
Отправлено: makar182 от Сентябрь 01, 2014, 08:41
1) dialog->ui->(object name), хотя желательно такого кода избегать и использовать сигналы/слоты

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



Название: Re: Вопрос по UI и не только
Отправлено: Bepec от Сентябрь 01, 2014, 10:07
Схема простая:
(Указатель на главный виджет(окно) )->ui->(указатель на виджет к которому обращаемся)->(метод виджета).
dialog->ui->lineEdit->setText

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

Но такой код не рекомендуется. Он ненадёжен и в нём имеются подводные камни.


Название: Re: Вопрос по UI и не только
Отправлено: 8Observer8 от Сентябрь 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();
}