![]() |
Главная · Все классы · Основные классы · Классы по группам · Модули · Функции | ![]() |
Файлы:
Пример "Extension" показывает, как добавить расширение к QDialog используя сигнал QAbstractButton::toggled() и слот QWidget::setVisible().
Приложение "Extension" - диалог, который позволяет пользователю выполнить простой поиск, а также более расширенный поиск.
Простой поиск имеет две опции: Match case и Search from start. Опции расширенного поиска включая возможности искать Whole words, Search backward и Search selection. После запуска приложения виден только простой поиск. Опции расширенного поиска располагаются в расширенной части приложения, и могут быть сделаны видимыми нажатием на кнопку More:
Класс 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 представляющий расширенную часть приложения.
В конструкторе мы сперва создаём стандартные дочерние виджеты для простого поиска: 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 |