Пример "Extension"
Файлы:
Пример "Extension" показывает, как добавить расширение к QDialog используя сигнал QAbstractButton::toggled() и слот QWidget::setVisible().
Приложение "Extension" - диалог, который позволяет пользователю выполнить простой поиск, а также более расширенный поиск.
Простой поиск имеет две опции: Match case и Search from start. Опции расширенного поиска включая возможности искать Whole words, Search backward и Search selection. После запуска приложения виден только простой поиск. Опции расширенного поиска располагаются в расширенной части приложения, и могут быть сделаны видимыми нажатием на кнопку More:
Определение класса 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 - чтобы разрешить расширенный поиск. В заключение, нам нужен 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.
Также мы помещаем флажки, связанные с опциями расширенного поиска, в компоновку установленную на виджет расширения.
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 © 2009 Nokia Corporation and/or its subsidiary(-ies) |
Торговые марки |
Qt 4.5.3 |
|