Главная · Все классы · Основные классы · Классы по группам · Модули · Функции

Пример "Extension"

Файлы:

Пример "Extension" показывает, как добавить расширение к QDialog используя сигнал QAbstractButton::toggled() и слот QWidget::setVisible().

Снимок экрана примера "Extension"

Приложение "Extension" - диалог, который позволяет пользователю выполнить простой поиск, а также более расширенный поиск.

Простой поиск имеет две опции: Match case и Search from start. Опции расширенного поиска включая возможности искать Whole words, Search backward и Search selection. После запуска приложения виден только простой поиск. Опции расширенного поиска располагаются в расширенной части приложения, и могут быть сделаны видимыми нажатием на кнопку More:

Снимок экрана примера "Extension"

Определение класса FindDialog

Класс FindDialog унаследован от QDialog. Класс QDialog является базовым для диалоговых окон. Диалоговое окно является окном верхнего уровня, используемым главным образом для коротких задач и лаконичного взаимодействия с пользователем.

 class FindDialog : public QDialog
 {
     Q_OBJECT

 public:
     FindDialog(QWidget *parent = 0);

 private:
     QLabel *label;
     QLineEdit *lineEdit;
     QCheckBox *caseCheckBox;
     QCheckBox *fromStartCheckBox;
     QCheckBox *wholeWordsCheckBox;
     QCheckBox *searchSelectionCheckBox;
     QCheckBox *backwardCheckBox;
     QDialogButtonBox *buttonBox;
     QPushButton *findButton;
     QPushButton *moreButton;
     QWidget *extension;
 };

Виджет FindDialog - основной виджет приложения, и выводит на экран приложения опции поиска и управляющие кнопки.

В дополнение к конструктору, мы объявляем несколько дочерних виджетов: Нам нужен QLineEdit со связанной меткой QLabel чтобы позволить пользователю набрать искомое слово, нам нужно несколько флажков QCheckBox чтобы в помощь опциям поиска, а также нам нужны три кнопки QPushButton: кнопка Find - для начала поиска, кнопка More - чтобы разрешить расширенный поиск и кнопка Close - чтобы завершить работу приложения. В заключение, нам нужен QWidget представляющий расширенную часть приложения.

Реализация класса FindDialog

В конструкторе мы сперва создаём стандартные дочерние виджеты для простого поиска: QLineEdit со связанной меткой QLabel, два флажка QCheckBox и все кнопки QPushButton.

 FindDialog::FindDialog(QWidget *parent)
     : QDialog(parent)
 {
     label = new QLabel(tr("Find &what:"));
     lineEdit = new QLineEdit;
     label->setBuddy(lineEdit);

     caseCheckBox = new QCheckBox(tr("Match &case"));
     fromStartCheckBox = new QCheckBox(tr("Search from &start"));
     fromStartCheckBox->setChecked(true);

     findButton = new QPushButton(tr("&Find"));
     findButton->setDefault(true);

     moreButton = new QPushButton(tr("&More"));
     moreButton->setCheckable(true);

Назначаем "быстрые" клавиши опций и кнопок используя символ &. В случае опции Find what нам также нужно использовать функцию QLabel::setBuddy(), чтобы заставить "быструю" клавишу работать как ожидалось; затем, когда пользователь нажмёт "быструю" клавишу указанную в метке, фокус ввода с клавиатуры передаётся на виджет-партнёр метки, QLineEdit.

Мы установили свойство по умолчанию Find кнопки равным true, используя функцию QPushButton::setDefault(). Затем кнопка будет нажата, если пользователь нажмёт клавишу Enter (или Return). Обратите внимание на то, что QDialog может содержать только одну кнопку по умолчанию.

     extension = new QWidget;

     wholeWordsCheckBox = new QCheckBox(tr("&Whole words"));
     backwardCheckBox = new QCheckBox(tr("Search &backward"));
     searchSelectionCheckBox = new QCheckBox(tr("Search se&lection"));

Затем мы создаём виджет расширения и флажки QCheckBox, связанные с опциями расширенного поиска.

     connect(moreButton, SIGNAL(toggled(bool)), extension, SLOT(setVisible(bool)));

     QVBoxLayout *extensionLayout = new QVBoxLayout;
     extensionLayout->setMargin(0);
     extensionLayout->addWidget(wholeWordsCheckBox);
     extensionLayout->addWidget(backwardCheckBox);
     extensionLayout->addWidget(searchSelectionCheckBox);
     extension->setLayout(extensionLayout);

Теперь, когда виджет расширения создан, мы можем соединить сигнал кнопки More, toggled(), со слотом виджета расширения setVisible().

Сигнал QAbstractButton::toggled() испускается всякий раз, когда меняется состояние триггерной кнопки. Аргумент сигнала равен true если кнопка отмечена, или false - если кнопка не отмечена. Слот QWidget::setVisible() устанавливает статус видимости виджета. Если статус равен true, виджет виден, в противном случае виджет скрыт.

Так как при создании мы сделали кнопку More триггерной, соединение обеспечивает показ виджета расширения в зависимости от состояния кнопки More.

Также мы соединяем кнопку Close со слотом QWidget::close(), и помещаем флажки, связанные с опциями расширенного поиска, в компоновку установленную на виджет расширения.

     QHBoxLayout *topLeftLayout = new QHBoxLayout;
     topLeftLayout->addWidget(label);
     topLeftLayout->addWidget(lineEdit);

     QVBoxLayout *leftLayout = new QVBoxLayout;
     leftLayout->addLayout(topLeftLayout);
     leftLayout->addWidget(caseCheckBox);
     leftLayout->addWidget(fromStartCheckBox);
     leftLayout->addStretch(1);

     QGridLayout *mainLayout = new QGridLayout;
     mainLayout->setSizeConstraint(QLayout::SetFixedSize);
     mainLayout->addLayout(leftLayout, 0, 0);
     mainLayout->addWidget(buttonBox, 0, 1);
     mainLayout->addWidget(extension, 1, 0, 1, 2);
     setLayout(mainLayout);

     setWindowTitle(tr("Extension"));

Перед созданием основной компоновки, мы создаём несколько дочерних компоновок для виджетов: Сперва мы выравниваем QLabel и его партнёра, QLineEdit, используя QHBoxLayout. Затем мы выравниваем вертикально QLabel и QLineEdit с флажками, связанными с простым поиском, используя QVBoxLayout. Также мы создаём QVBoxLayout для кнопок. Наконец, мы компонуем две последних компоновки и виджет расширения используя QGridLayout.

     extension->hide();
 }

В заключение, мы скрываем виджет расширения используя функцию QWidget::hide(), заставляя приложение показать только опции простого поиска при запуске. Когда пользователь хочет получить доступ к опциям расширенного поиска, диалогу только нужно изменить видимость виджета расширения. Управление компоновкой Qt заботится о внешнем виде диалога.


Copyright © 2008 Trolltech Торговые марки
Qt 4.3.5