На этом шаге рассмотрим создание файла gotocelldialog.срр - файла реализации методов класса GoToCellDialog.
Реализацию методов класса выполним в файле gotocelldialog.срр:
#include <QRegExp> #include <QWidget> #include "gotocelldialog.h" GoToCellDialog::GoToCellDialog(QWidget *parent) : QDialog(parent) { setupUi(this); QRegExp regExp("[A-Za-z][1-9][0-9]{0,2}"); lineEdit->setValidator(new QRegExpValidator(regExp, this)); connect(okButton, SIGNAL(clicked()), this, SLOT(accept())); connect(cancelButton, SIGNAL(clicked()), this, SLOT(reject())); } void GoToCellDialog::on_lineEdit_textChanged() { okButton->setEnabled(lineEdit->hasAcceptableInput()); }
В конструкторе мы вызываем setupUi() для инициализации формы. Благодаря множественному наследованию мы можем непосредственно получить доступ к членам класса Ui::GoToCellDialog. После создания пользовательского интерфейса setupUi() будет также автоматически подключать все слоты с именами типа on_objectName_signalName() к соответствующему сигналу signalName() виджета objectName. В нашем примере это означает, что setupUi() будет устанавливать следующее соединение "сигнал-слот":
connect(lineEdit, SIGNAL(textChanged(const QString &)), this, SLOT(on_lineEdit_textChanged()));
Также в конструкторе мы задаем ограничение на допустимый диапазон вводимых значений. Qt обеспечивает три встроенных класса по проверке правильности значений: QIntValidator, QDoubleValidator и QRegExpValidator. В нашем случае мы используем QRegExpValidator, задавая регулярное выражение "[A-Za-z] [1-9][0-9]{0,2}", которое означает следующее: допускается одна маленькая или большая буква, за которой следует одна цифра в диапазоне от 1 до 9; затем идут ноль, одна или две цифры в диапазоне от 0 до 9. Введение в регулярные выражения вы можете найти в документации по классу QRegExp.
Указывая в конструкторе QRegExpValidator значение this, мы его делаем дочерним элементом объекта GoToCellDialog. После этого нам можно не беспокоиться об удалении в будущем QRegExpValidator; этот объект будет удален автоматически после удаления его родительского элемента.
Механизм взаимодействия объекта с родительскими и дочерними элементами реализован в QObject. Когда мы создаем объект (виджет, функция по проверке правильности значений или любой другой объект) и он имеет родительский объект, то к списку дочерних элементов этого родителя добавится и данный объект. При удалении родительского элемента будет просмотрен список его дочерних элементов, и все они будут удалены. Эти дочерние элементы в свою очередь сами удалят все свои дочерние элементы, и эта процедура будет выполняться до тех пор, пока ничего не останется.
Механизм взаимодействия объекта с родительскими и дочерними элементами значительно упрощает управление памятью, снижая риск утечек памяти. Явным образом мы должны удалять только объекты, которые созданы оператором new и которые не имеют родительского элемента. А если мы удаляем дочерний элемент до удаления его родителя, то Qt автоматически удалит этот объект из списка дочерних объектов этого родителя.
Для виджетов родительский объект имеет дополнительный смысл: дочерние виджеты размещаются внутри области, которую занимает родительский объект. При удалении родительского виджета не только освобождается занимаемая дочерними объектами память - он исчезает с экрана.
В конце конструктора мы подключаем кнопку ОК к слоту accept() виджета QDialog и кнопку Cancel к слоту reject(). Оба слота закрывают диалог, но accept() устанавливает результат диалога на значение QDialog:: Accepted (которое равно 1), a reject() устанавливает результат на значение QDialog::Rejected (которое равно 0). При использовании этого диалога мы можем использовать результат, чтобы узнать, была ли нажата кнопка ОК, и действовать соответствующим образом.
Слот on_lineEdit_textChanged() устанавливает кнопку ОК в активное или неактивное состояние в зависимости от наличия в строке редактирования допустимого обозначения ячейки. QLineEdit:: hasAcceptableInput() использует функцию проверки допустимости значений, которую мы задали в конструкторе.
На этом завершается построение диалога. Теперь мы можем переписать main.срр следующим образом:
#include <QApplication> #include "gotocelldialog.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); GoToCellDialog *dialog = new GoToCellDialog; dialog->show(); return app.exec(); }
Заново сгенерируйте файл gotocell.pro с помощью команды qmake -project (поскольку мы добавили в проект файлы исходного кода), запустите команду qmake gotocell. pro, чтобы обновить make-файл, а затем снова постройте и запустите приложение. Наберите в строке редактирования значение А12 и обратите внимание на то, как кнопка ОК становится активной. Попытайтесь ввести какой-нибудь произвольный текст и посмотрите, как сработает функция по проверке допустимости значения. Нажмите кнопку Cancel для закрытия диалогового окна.
На следующем шаге внесем некоторые изменения в созданный нами проект.