Пример "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, связанные с опциями расширенного поиска. #if defined(Q_OS_SYMBIAN) || defined(Q_WS_SIMULATOR) // Создаём меню QMenu *menu = new QMenu(this); // Создаём элемент меню Find menu->addAction(tr("Find")); // Создаём элемент меню More QAction *moreAction = menu->addAction(tr("More")); moreAction->setCheckable(true); // Создаём Options CBA QAction *optionAction = new QAction(tr("Options"), this); // Устанавливаем указанное меню на кнопку Options optionAction->setMenu(menu); optionAction->setSoftKeyRole(QAction::PositiveSoftKey); addAction(optionAction); // Подсоединяем элемент меню More к слоту setVisible connect(moreAction, SIGNAL(triggered(bool)), extension, SLOT(setVisible(bool))); // Создаём Exit CBA QAction *backSoftKeyAction = new QAction(QString(tr("Exit")), this); backSoftKeyAction->setSoftKeyRole(QAction::NegativeSoftKey); // Кнопка Exit закрывает приложение connect(backSoftKeyAction, SIGNAL(triggered()), qApp, SLOT(quit())); addAction(backSoftKeyAction); #else buttonBox = new QDialogButtonBox(Qt::Vertical); buttonBox->addButton(findButton, QDialogButtonBox::ActionRole); buttonBox->addButton(moreButton, QDialogButtonBox::ActionRole); connect(moreButton, SIGNAL(toggled(bool)), extension, SLOT(setVisible(bool))); #endif 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); QGridLayout *mainLayout = new QGridLayout; #if !defined(Q_OS_SYMBIAN) && !defined(Q_WS_MAEMO_5) && !defined(Q_WS_SIMULATOR) mainLayout->setSizeConstraint(QLayout::SetFixedSize); #endif mainLayout->addLayout(leftLayout, 0, 0); #if !defined(Q_OS_SYMBIAN) && !defined(Q_WS_SIMULATOR) mainLayout->addWidget(buttonBox, 0, 1); #endif mainLayout->addWidget(extension, 1, 0, 1, 2); mainLayout->setRowStretch(2, 1); setLayout(mainLayout); setWindowTitle(tr("Extension")); Перед созданием основной компоновки, мы создаём несколько дочерних компоновок для виджетов: Сперва мы выравниваем QLabel и его партнёра, QLineEdit, используя QHBoxLayout. Затем мы выравниваем вертикально QLabel и QLineEdit с флажками, связанными с простым поиском, используя QVBoxLayout. Также мы создаём QVBoxLayout для кнопок. Наконец, мы компонуем две последних компоновки и виджет расширения используя QGridLayout. extension->hide(); } В заключение, мы скрываем виджет расширения используя функцию QWidget::hide(), заставляя приложение показать только опции простого поиска при запуске. Когда пользователь хочет получить доступ к опциям расширенного поиска, диалогу только нужно изменить видимость виджета расширения. Управление компоновкой Qt заботится о внешнем виде диалога. |
|
Попытка перевода Qt документации. Если есть желание присоединиться, или если есть замечания или пожелания, то заходите на форум: Перевод Qt документации на русский язык... Люди внесшие вклад в перевод: Команда переводчиков |