Второе соединение устанавливается между сигналом toggled(bool) виджета moreButton и слотом setVisible(bool) виджета tertiaryGroupBox. После установки соединения выберите функцию меню Edit | Edit Widgets для выхода из режима установки соединений.
Сохраните диалог под именем sortdialog.ui в каталоге sort. Для добавления программного кода в форму мы будем использовать тот же подход на основе множественного наследования, который нами применялся в предыдущем разделе для диалога «Go-to-Cell».
Сначала создаем файл sortdialog.h со следующим содержимым:
01 #ifndef SORTDIALOG_H
02 #define SORTDIALOG_H
03 #include <QDialog>
04 #include "ui_sortdialog.h"
05 class SortDialog : public QDialog, public Ui::SortDialog
06 {
07 Q_OBJECT
08 public:
09 SortDialog(QWidget *parent = 0);
10 void setColumnRange(QChar first, QChar last);
11 };
12 #endif
Затем создаем sortdialog.cpp:
01 #include <QtGui>
02 #include "sortdialog.h"
03 SortDialog::SortDialog(QWidget *parent)
04 : QDialog(parent)
05 {
06 setupUi(this);
07 secondaryGroupBox->hide();
08 tertiaryGroupBox->hide();
09 layout()->setSizeConstraint(QLayout::SetFixedSize);
10 setColumnRange('А', 'Z');
11 }
12 void SortDialog::setColumnRange(QChar first, QChar last)
13 {
14 primaryColumnCombo->clear();
15 secondaryColumnCombo->clear();
16 tertiaryColumnCombo->clear();
17 secondaryColumnCombo->addItem(tr("None"));
18 tertiaryColumnCombo->addItem(tr("None"));
19 primaryColumnCombo->setMinimumSize(
20 secondaryColumnCombo->sizeHint());
21 QChar ch = first;
22 while (ch <= last) {
23 primaryColumnCombo->addItem(QString(ch));
24 secondaryColumnCombo->addItem(QString(ch));
25 tertiaryColumnCombo->addItem(QString(ch));
26 ch = ch.unicode() + 1;
27 }
28 }
Конструктор прячет ту часть диалогового окна, где располагаются поля второго и третьего ключей. Он также устанавливает свойство sizeConstraint менеджера компоновки формы на значение QLayout::SetFixedSize, не позволяя пользователю изме-
От составителя. Страница №42 в исходном DjVu была пропущена! У кого есть — вставьте.
Создавать в Qt другой распространенный тип изменяющихся диалоговых окон, многостраничные диалоговые окна, даже еще проще как при ручном кодировании, так и при использовании Qt Designer. Такие диалоговые окна можно строить различными способами:
• можно непосредственно воспользоваться виджетом окно с вкладками QTabWidget. Здесь сверху окна имеется полоска вкладок, которая находится под управлением стека QStackedWidget;
• можно совместно использовать список QListWidget и стек QStackedWidget, где текущий элемент списка будет определять страницу, показываемую стеком QStackedWidget, обеспечив связь сигнала QListWidget::currentRowChanged() со слотом QStackedWidget::setCurrentIndex();
• можно виджет древовидной структуры QTreeWidget совместно использовать со стеком QStackedWidget, как в предыдущем случае.
Класс стека QStackedWidget рассматривается в главе 6 («Управление компоновкой»).
Динамические диалоговые окна
Динамическими называются диалоговые окна, которые создаются на основе файлов .ui, сделанных в Qt Designer, во время выполнения приложения. Вместо преобразования файла .ui компилятором uic в программу на С++ мы можем загрузить этот файл на этапе выполнения, используя класс QUiLoader:
QUiLoader uiLoader;
QFile file("sortdialog.ui");
QWidget *sortDialog = uiLoader.load(&file);
if (sortDialog) {
…
}
Мы можем осуществлять доступ к дочерним виджетам формы при помощи функции QObject::findChild<T>():
QComboBox *primaryColumnCombo =
sortDialog->findChild<QComboBox *>("primaryColumnCombo");
if (primaryColumnCombo) {
…
}
Функция findChild<T>() является шаблонной функцией—членом, которая возвращает дочерний объект по заданному имени и типу. Эта функция отсутствует для MSVC 6 из-за ограничений этого компилятора. Если вам необходимо использовать компилятор MSVC 6, вместо этой функции следует вызывать глобальную функцию qFindChild<T>(), которая работает точно так же.
Класс QUiLoader расположен в отдельной библиотеке. Для использования класса QUiLoader в приложении Qt мы должны добавить в файл .pro следующую строку: