QT 4: программирование GUI на С++ | страница 30
> …
> void setupUi(QWidget *widget) {
> …
> }
>};
Сгенерированный класс не наследует никакой Qt—класс. При использовании формы в main.cpp мы создаем QDialog и передаем его функции setupUi().
Если вы станете выполнять программу в данный момент, она будет работать, но не совсем так, как требуется:
• кнопка OK всегда будет в неактивном состоянии;
• кнопка Cancel не выполняет никаких действий;
• поле редактирования будет принимать любой текст, а оно должно принимать только допустимое обозначение ячейки.
Правильную работу диалогового окна мы можем обеспечить, написав некоторый программный код. Лучше всего создать новый класс, который наследует QDialog и Ui::GoToCellDialog и реализует недостающую функциональность (подтверждая известное утверждение, что любую проблему программного обеспечения можно решить, просто добавив еще один уровень представления объектов). По нашим правилам мы даем этому новому классу такое же имя, которое генерируется компилятором uic, но без префикса Ui::.
Используя текстовый редактор, создайте файл с именем gotocelldialog.h, который будет содержать следующий код:
>01 #ifndef GOTOCELLDIALOG_H
>02 #define GOTOCELLDIALOG_H
>03 #include
>04 #include "ui_gotocelldialog.h"
>05 class GoToCellDialog : public QDialog, public Ui::GoToCellDialog
>06 {
>07 Q_OBJECT
>08 public:
>09 GoToCellDialog(QWidget *parent = 0);
>10 private slots:
>11 void on_lineEdit_textChanged();
>12 };
>13 #endif
Реализация методов класса делается в файле gotocelldialog.cpp:
>01 #include
>02 #include "gotocelldialog.h"
>03 GoToCellDialog::GoToCellDialog(QWidget *parent)
>04 : QDialog(parent)
>05 {
>06 setupUi(this);
>07 QRegExp regExp("[A-Za-z][1-9][0-9]{0,2}");
>08 lineEdit->setValidator(new QRegExpValidator(regExp, this));
>09 connect(okButton, SIGNAL(clicked()),
>10 this, SLOT(accept()));
>11 connect(cancelButton, SIGNAL(clicked()),
>12 this, SLOT(reject()));
>13 }
>14 void GoToCellDialog::on_lineEdit_textChanged()
>15 {
>16 okButton->setEnabled(lineEdit->hasAcceptableInput());
>17 }
В конструкторе мы вызываем setupUi() для инициализации формы. Благодаря множественному наследованию мы можем непосредственно получить доступ к членам класса Ui::GoToCellDialog. После создания пользовательского интерфейса setupUi() будет также автоматически подключать все слоты с именами типа on_objectName_signalName() к соответствующему сигналу signalName()