На этом шаге закончим рассматривать проектирование изменяемых диалоговых окон и добавим в форму программный код.
#ifndef SORTDIALOG
#define SORTDIALOG
#include <QDialog>
#include "ui_sortdialog.h"
class SortDialog : public QDialog, public Ui::SortDialog
{
Q_OBJECT
public:
SortDialog(QWidget *parent = 0);
void setColumnRange(QChar first, QChar last);
};
#endif // SORTDIALOG
#include <QtGui> #include "sortdialog.h" /*Конструктор прячет ту часть диалогового окна, где располагаются поля второго и третьего ключа. Он также устанавливает свойство sizeConstraint менеджера компоновки формы на значение QLayout:: SetFixedSize, не позволяя пользователю изменять размеры диалогового окна. В этом случае менеджер компоновки отвечает за изменение размеров, и он автоматически изменяет его размеры при появлении или исчезновении дочерних виджетов, всегда обеспечивая оптимальный размер диалогового окна*/ SortDialog::SortDialog(QWidget *parent) : QDialog(parent) { setupUi(this); secondaryGroupBox->hide(); tertiaryGroupBox->hide(); layout()->setSizeConstraint(QLayout::SetFixedSize); setColumnRange('A', 'Z'); } /*Слот setColumnRange() инициализирует содержимое полей с выпадающим списком в зависимости от выделенных столбцов электронной таблицы. Мы вставили элемент «None» (значение отсутствует) для полей второго и третьего ключа сортировки (эти ключи необязательны). Функция QWidget::sizeHint() возвращает размер виджета, "идеальный" с точки зрения системы компоновки. Именно поэтому виджетам различного типа или подобным виджетам с различным содержимым может назначаться системой компоновки неодинаковый размер. Это объясняет разный размер полей с выпадающим списком, когда размер поля второго и третьего ключа сортировки со значением "None" больше, чем размер поля первичного ключа, в качестве значения которого используется только одна буква. Чтобы не было такого несоответствия, мы устанавливаем минимальный размер поля первичного ключа на "идеальный" размер поля вторичного ключа*/ void SortDialog::setColumnRange(QChar first, QChar last) { primaryColumnCombo->clear(); secondaryColumnCombo->clear(); tertiaryColumnCombo->clear(); secondaryColumnCombo->addItem(tr("None")); tertiaryColumnCombo->addItem(tr("None")); primaryColumnCombo->setMinimumSize( secondaryColumnCombo->sizeHint()); QChar ch = first; while (ch <= last) { primaryColumnCombo->addItem(QString(ch)); secondaryColumnCombo->addItem(QString(ch)); tertiaryColumnCombo->addItem(QString(ch)); ch = ch.unicode() + 1; } }
#include <QApplication>
#include "sortdialog.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
SortDialog *dialog = new SortDialog;
dialog->setColumnRange('C','F');//задаем диапазон столбцов
dialog->show();
return app.exec();
}
На этом завершается построение расширяемого диалогового окна. Как показывает этот пример, проектировать расширяемые диалоговые окна не намного сложнее, чем проектировать обычные диалоговые окна. Все, что нам здесь потребовалось, - это кнопка переключения, несколько дополнительных связей "сигнал-слот" и использование менеджера компоновки с запрещением изменения размера.
Создавать в Qt другой распространенный тип изменяющихся диалоговых окон, многостраничные диалоговые окна, даже еще проще как при ручном кодировании, так и при использовании Qt Designer. Такие диалоговые окна можно строить различными способами:
Файлы приложения можно взять здесь.
На следующем шаге рассмотрим динамические диалоговые окна.