Шаг 157.
Библиотека Qt.
Проектирование диалоговых окон в Qt Designer. Создание файла реализации

    На этом шаге рассмотрим создание файла 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 для закрытия диалогового окна.

    На следующем шаге внесем некоторые изменения в созданный нами проект.




Предыдущий шаг Содержание Следующий шаг