Пример "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 - чтобы разрешить расширенный поиск и кнопка 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 заботится о внешнем виде диалога.
|
Попытка перевода Qt документации. Если есть желание присоединиться, или если есть замечания или пожелания, то заходите на форум: Перевод Qt документации на русский язык... Люди внесшие вклад в перевод: Команда переводчиков |