Изменяющиеся диалоговые окна. Окончание

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

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

    • можно непосредственно воспользоваться виджетом окно с вкладками QTabWidget. Здесь сверху окна имеется полоска вкладок, которая контролирует встроенный стек QStackedWidget;
    • можно совместно использовать список QListWidget и стек QStackedWidget, где текущий элемент списка будет определять страницу, показываемую стеком QStackedWidget, обеспечив связь сигнала QListWidget::currentRowChanged() со слотом QStackedWidget::setCurrentIndex();
    • можно виджет древовидной структуры QTreeWidget совместно использовать со стеком QStackedWidget, как в предыдущем случае.

       
    Файлы приложения можно взять Предыдущий шаг
    Содержание
    Следующий шаг



    Вы можете оставить комментарий, или Трекбэк с вашего сайта.

    Оставить комментарий