Шаг 162.
Библиотека Qt.
Изменяющиеся диалоговые окна. Окончание

    На этом шаге закончим рассматривать проектирование изменяемых диалоговых окон и добавим в форму программный код.

  1. Сначала создаем файл sortdialog.h со следующим содержимым:

    #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

  2. Теперь создаем sortdialog.cpp:

    #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;
       }
    }

  3. Теперь создаем main.cpp:

    #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. Такие диалоговые окна можно строить различными способами:

    Файлы приложения можно взять здесь.

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




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