Добавить кнопку в QButtonGroup можно с помощью метода insert или заданием QButtonGroup в качестве родительского виджета кнопки. Для уникального обозначения каждой кнопки в группе можно задать id в методе insert. Это особенно полезно при определении выбранной кнопки, т.к. функция selectedId возвращает id выбранной кнопки.
Все кнопки QRadioButton, добавляемые в группу, автоматически становятся кнопками с исключающим выбором.
Далее приведены прототипы конструкторов QRadioButton и одного уникального метода, который не вызовет большого удивления:
#include <qradiobutton.h>
QRadioButton(QWidget* parent, const char* name = 0);
QRadioButton(const QString& text, QWidget *parent, const char *name = 0);
bool QRadioButton::isChecked();
Выполните упражнение 17.5.
QButtonТеперь применим полученные знания в примере с кнопками Qt. Приведенная далее программа создает кнопки разных типов (радиокнопки, флажки и простые кнопки), чтобы показать, как использовать эти виджеты в ваших приложениях.
1. Введите файл Buttons.h:
#include <qmainwindow.h>
#include <qcheckbox.h>
#include <qbutton.h>
#include <qradiobutton.h>
class Buttons : public CMainWindow {
Q_OBJECT
public:
Buttons(QWidget *parent = 0, const char *name = 0);
2. Вы запросите состояние ваших кнопок позже, в функции слота, поэтому объявите указатели кнопок и вспомогательную функцию PrintActive с атрибутом private в объявлении класса:
private:
void PrintActive(QButton *button);
QCheckBox *checkbox;
QRadioButton *radiobutton1, *radiobutton2;
private slots:
void Clicked();
}
3. Далее следует файл Buttons.срр:
#include "Buttons.moc"
#include <qbuttongroup.h>
#include <qpushbutton.h>
#include <qapplication.h>
#include <qlabel.h>
#include <qlayout.h>
#include <iostream>
Buttons::Buttons(QWidget *parent, const char *name) :
QMainWindow(parent, name) {
QWidget* widget = new QWidget(this);
setCentralWidget(widget);
QVBoxLayout *vbox = new QVBoxLayout(widget, 5, 10, "vbox");
checkbox = new QCheckBox("CheckButton", widget, "check");
vbox->addWidget(checkbox);
4. Затем вы создаете QButtonGroup для двух ваших радиокнопок (переключателей).
QButtonGroup *buttongroup = new QButtonGroup(0);
radiobutton1 = new QRadioButton("RadioButton1", widget, "radio1");
buttongroup->insert(radiobutton1);
vbox->addWidget(radiobutton1);
radiobutton2 = new QRadioButton("RadioButton2", widget, "radio2");
buttongroup->insert(radiobutton2);
vbox->addWidget(radiobutton2);
QPushButton* button = new QPushButton("Ok", widget, "button");
vbox->addWidget(button);
resize(350, 200);
connect(button, SIGNAL(clicked()), this, SLOT(Clicked()));
}
5. Затем приведен удобный метод для вывода состояния заданной кнопки QButton:
void Buttons::PrintActive(QButton *button) {
if (button->isOn())
std::cout << button->name() << " is checked\n";
else
std::cout" << button->name() << " is not checked\n";
}
void Buttons::Clicked(void) {
PrintActive(checkbox);
PrintActive(radiobutton1);
PrintActive(radiobutton2);
std::cout << "\n";
}
int main(int argc, char **argv) {
QApplication app(argc, argv);
Buttons *window = new Buttons();
app.setMainWidget(window);
window->show();
return app.exec();
}
Как это работает
Этот простой пример показывает, как опрашивать виджеты кнопок Qt разных типов. После создания все они по большей части действуют одинаково. Например, функция PrintActive демонстрирует, как получить состояние кнопки (включена или выключена). Обратите внимание на то, как она действует в случае запоминающих состояние кнопок разных типов, таких как флажки и переключатели (радиокнопки). В основном отличаются только вызовы для создания виджета кнопки. Радиокнопки, наиболее сложные (т.к. только одна в группе может быть включена), при создании требуют больше всего работы. В случае радиокнопок вы должны создать QButtonGroup для того, чтобы гарантировать активность только одной радиокнопки в группе в любой момент времени.
QComboBox
Переключатели (радиокнопки) — отличный способ, позволяющий пользователю выбрать из небольшого числа вариантов, скажем шести или меньше. Если вариантов больше шести, ситуация начинает выходить из-под контроля и становится еще более напряженной, когда количество вариантов растет, что приводит к ощутимому увеличению размера окна. В этом случае прекрасным решением может быть использование поля ввода с раскрывающимся меню, также называемое раскрывающимся списком (combo box). Варианты выводятся, когда вы щелкаете кнопкой мыши и открываете меню и количество вариантов при этом ограничено только удобством поиска в списке.
В виджете QComboBox сочетаются функциональные возможности виджетов QLineEdit и QPushButton и раскрывающихся меню, позволяя выбрать один вариант из неограниченного набора вариантов.