На этом шаге рассмотрим использование класса QDialogButtonBox.
На практике нам следовало бы использовать QDialogButtonBox, виджет, содержащий указанные нами кнопки и представляющий их правильно в той системе отображения окон, в которой было запущено приложение. Чтобы диалоговое окно использовало QDialogButtonBox, мы должны изменить как дизайн, так и код. В Qt Designer нужно выполнить всего четыре действия:
Если бы мы внесли изменения только в дизайн формы, например изменили бы компоновку диалогового окна и свойства виджетов, мы могли бы просто заново построить приложение. Однако здесь мы удалили несколько виджетов и добавили новый виджет, и в этом случае мы должны внести изменения также и в код.
Изменения нужно внести в файл gotocelldialog.срр. Вот новая версия конструктора:
GoToCellDialog::GoToCellDialog(QWidget *parent) : QDialog(parent) { setupUi(this); buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false); QRegExp regExp("[A-Za-z][1-9][0-9]{0,2}"); lineEdit->setValidator(new QRegExpValidator(regExp, this)); connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept())); connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject())); }
В предыдущей версии мы исходно отключили кнопку ОК в Qt Designer. В QDialogButtonBox мы не можем этого сделать, так что мы сделаем это в коде, сразу после вызова функции setupUi(). Класс QDialogButtonBox содержит перечислимый тип со стандартными кнопками, и мы можем использовать его для доступа к конкретным кнопкам, в данном случае к кнопке ОК.
Очень удобно, что по умолчанию в Qt Designer именем, объекта QDialogButtonBox будет buttonBox. Оба соединения устанавливаются с полями кнопок, а не с самими кнопками. Сигнал accepted() генерируется при нажатии кнопки с опцией AcceptRole, и, аналогично, сигнал rejected() генерируется при нажатии кнопки с опцией RejectRole. По умолчанию стандартная кнопка QDialogButtonBox::0k имеет опцию AcceptRole, а кнопка QDialogButtonBox::Cancel - опцию RejectRole.
Необходимо внести еще только одно изменение - в слоте on_lineEdit_textChanged():
void GoToCellDialog::on_lineEdit_textChanged() { buttonBox->button(QDialogButtonBox::Ok)->setEnabled( lineEdit->hasAcceptableInput()); }
Файлы приложения можно взять здесь.
Единственным отличием здесь будет то, что вместо обращения к конкретной кнопке, хранящейся как переменная-член, мы обращаемся к кнопке ОК поля кнопок.
Привлекательной особенностью применения Qt Designer является возможность программисту действовать достаточно свободно при изменении дизайна формы, причем при этом исходный код программы не будет нарушен. При разработке формы с непосредственным написанием операторов C++ на изменение дизайна уходит много времени. При использовании Qt Designer не будет тратиться много времени, поскольку uic просто заново генерирует исходный код программы для форм, которые были изменены.
Пользовательский интерфейс диалога сохраняется в файле .ui (который имеет формат XML), а соответствующая функциональная часть реализуется путем создания подкласса сгенерированного компилятором uic класса.
На следующем шаге рассмотрим создание изменяющихся диалоговых окон.