QT 4: программирование GUI на С++
Шрифт:
Теперь, когда форма спроектирована, мы готовы обеспечить ее функциональное наполнение, устанавливая некоторые соединения «сигнал—слот». Qt Designer позволяет устанавливать соединения между виджетами одной формы. Нам требуется обеспечить два соединения.
Выберите функцию меню Edit | Edit Signals/Slots (Правка | Редактировать сигналы и слоты) для входа в режим формирования соединений в Qt Designer. Соединения представлены синими стрелками между виджетами формы. Поскольку нами выбран шаблон «Dialog with Buttons Right», кнопки OK и CanceI уже подключены к слотам accept и reject виджета QDialog. Эти соединения также указаны в окне редактора
Рис. 2.13. Имена виджетов формы.
Для установки соединения между двумя виджетами щелкните по виджету, передающему сигнал, соедините красную стрелку с виджетом — получателем сигнала и отпустите клавишу мышки. В результате будет выдано диалоговое окно, позволяющее выбрать для соединения сигнал и слот.
Рис. 2.14. Соединение виджетов формы.
Сначала устанавливается соединение между moreButton и secondaryGroupBox. Соедините эти два виджета красной стрелкой, затем выберите toggled(bool) в качестве сигнала и setVisible(bool) в качестве слота. По умолчанию Qt Designer не имеет в списке слотов setVisible(bool), но он появится, если вы включите режим «Show all signals and slots» (Показывать все сигналы и слоты).
Рис. 2.15. Редактор соединений в QtDesigner.
Второе соединение устанавливается между сигналом toggled(bool) виджета moreButton и слотом setVisible(bool) виджета tertiaryGroupBox. После установки соединения выберите функцию меню Edit | Edit Widgets для выхода из режима установки соединений.
Сохраните диалог под именем sortdialog.ui в каталоге sort. Для добавления программного кода в форму мы будем использовать тот же подход на основе множественного наследования, который нами применялся в предыдущем разделе для диалога «Go-to-Cell».
Сначала создаем файл sortdialog.h со следующим содержимым:
Затем создаем sortdialog.cpp:
Конструктор
прячет ту часть диалогового окна, где располагаются поля второго и третьего ключей. Он также устанавливает свойство 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:
Мы можем осуществлять доступ к дочерним виджетам формы при помощи функции QObject::findChild<T>: