На этом шаге рассмотрим создание собственного диалогового окна.
Окна программы, показанные на рис. 1, иллюстрируют создание собственного диалогового окна. При запуске программы на экране появляется окно с кнопкой "Нажми меня", нажатие на которую отображает диалоговое окно ввода имени и фамилии.
Рис.1. Собственное диалоговое окно
Рассмотрим класс для создания собственного диалогового окна.
//Для создания собственного диалогового окна нужно унаследовать класс QDialog class InputDialog : public QDialog { Q_OBJECT private: //Класс InputDialog содержит два атрибута — указатели m_ptxtFirstName и //m_ptxtLastName на виджеты однострочных текстовых полей QLineEdit* m_ptxtFirstName; QLineEdit* m_ptxtLastName; public: InputDialog(QWidget* pwgt = 0); //и два метода, возвращающие содержимое этих полей: firstName() и lastName() QString firstName() const; QString lastName () const; };
Рассмотрим часть текста конструктора класса InputDialog.
InputDialog::InputDialog(QWidget* pwgt/*= 0*/) : QDialog(pwgt) { .... QPushButton* pcmdOk = new QPushButton("&Применить"); QPushButton* pcmdCancel = new QPushButton("&Отменить"); //Сигналы clicked() кнопок Применить и Отменить //соединяются со слотами accept() и rejected() соответственно. //Это делается для того, чтобы метод exec() возвращал //при нажатии кнопки Применить значение QDialog::Accepted, //а при нажатии на кнопку Отменить — значение QDialog::Rejected connect(pcmdOk, SIGNAL(clicked()), SLOT(accept())); connect(pcmdCancel, SIGNAL(clicked()), SLOT(reject())); .... }
Метод firstName() возвращает введенное пользователем имя, а метод lastName() - фамилию.
QString InputDialog::firstName() const { return m_ptxtFirstName->text(); } QString InputDialog::lastName() const { return m_ptxtLastName->text(); }
Рассмотрим текст заголовочного файла StartDialog.h:
//Класс StartDialog унаследован от класса кнопки QPushButton class StartDialog : public QPushButton { Q_OBJECT public: StartDialog(QWidget* pwgt = 0) : QPushButton("Нажми меня", pwgt) { //Сигнал clicked() методом connect() соединяется со слотом slotButtonClicked() connect(this, SIGNAL(clicked()), SLOT(slotButtonClicked())); } public slots: //В слоте создается объект диалогового окна InputDialog, который не имеет предка. //Диалоговые окна, не имеющее предка, //будут центрироваться на экране. //Окна с предками будут отцентрированы относительно предка void slotButtonClicked() { InputDialog* pInputDialog = new InputDialog; //В условии оператора if выполняется запуск диалогового окна. //После же его закрытия управление передается основной программе //и метод exec() возвращает значение нажатой пользователем кнопки if (pInputDialog->exec() == QDialog::Accepted) { //В том случае, если пользователем была нажата кнопка Ok, //будет отображено информационное окно с введенными //в диалоговом окне данными QMessageBox::information(0,"Приветствие", "Здравствуйте, " + pInputDialog->firstName() + " " + pInputDialog->lastName() ); } //По завершении метода диалоговое окно нужно удалить, //т. к. у него нет предка, который позаботится об этом delete pInputDialog; } };
Файлы приложения можно взять здесь.
На следующем шаге рассмотрим cтандартные диалоговые окна, а именно диалоговое окно выбора файлов.