Пример "Group Box"
Файлы:
Пример "Group Box" показывает, как использовать различные виды групповых рамок в Qt.
Групповые рамки - это контейнер виджетов, который упорядочивает кнопки по группам, и логически, и на экране. Они управляют взаимодействием между пользователем и приложением для того, чтобы не навязывать простые ограничения.
Групповые рамки обычно используются для упорядочивания флажков и радиокнопок в единые группы.

Пример "Group Boxes" состоит из единственного класса Window, который используется для показа четырёх групповых рамок: единой группы радиокнопок, не единой группы флажков, единой группы радиокнопок c включающим флажком и групповая рамка с обычными кнопками.
Определение класса Window
Класс Window является подклассом QWidget, который используется для вывода на экран некоторого количества групповых рамок. Определение класса содержит функции для создания каждой групповой рамки и заполнения их различными подборками виджетов кнопок:
class Window : public QWidget
{
Q_OBJECT
public:
Window(QWidget *parent = 0);
private:
QGroupBox *createFirstExclusiveGroup();
QGroupBox *createSecondExclusiveGroup();
QGroupBox *createNonExclusiveGroup();
QGroupBox *createPushButtonGroup();
};
В примере виджет будет использоваться как окно верхнего уровня, поэтому конструктор объявляется таким образом, чтобы родительский виджет не задавался.
Реализация класса Window
Конструктор создаёт компоновку-сетку и заполняет её всеми групповыми рамками, которые будут выводиться на экран:
Window::Window(QWidget *parent)
: QWidget(parent)
{
QGridLayout *grid = new QGridLayout;
grid->addWidget(createFirstExclusiveGroup(), 0, 0);
grid->addWidget(createSecondExclusiveGroup(), 1, 0);
grid->addWidget(createNonExclusiveGroup(), 0, 1);
grid->addWidget(createPushButtonGroup(), 1, 1);
setLayout(grid);
setWindowTitle(tr("Group Boxes"));
resize(480, 320);
}
Функции используются для создания групповых рамок, каждая возвращает QGroupBox для вставки в компоновку-сетку.
QGroupBox *Window::createFirstExclusiveGroup()
{
QGroupBox *groupBox = new QGroupBox(tr("Exclusive Radio Buttons"));
QRadioButton *radio1 = new QRadioButton(tr("&Radio button 1"));
QRadioButton *radio2 = new QRadioButton(tr("R&adio button 2"));
QRadioButton *radio3 = new QRadioButton(tr("Ra&dio button 3"));
radio1->setChecked(true);
Первая групповая рамка содержит и управляет тремя радиокнопками. Поскольку групповая рамка содержит только радиокнопки, то она является исключающей по умолчанию, поэтому только одна радиокнопка может быть отмечена в любой момент времени. Проверим первую радиокнопку, чтобы убедиться, что группа кнопок содержит одну отмеченную кнопку.
QVBoxLayout *vbox = new QVBoxLayout;
vbox->addWidget(radio1);
vbox->addWidget(radio2);
vbox->addWidget(radio3);
vbox->addStretch(1);
groupBox->setLayout(vbox);
return groupBox;
}
Используем вертикальную компоновку внутри групповой рамки, чтобы поместить кнопки в виде вертикального списка, и возвращаем групповую рамку в конструктор.
Вторая групповая рамка сама по себе является отмечаемой, предоставляя удобный способ для отключения всех кнопок внутри неё. Первоначально, она не отмечена, поэтому сама групповая рамка должна быть отмечена до отметки любой радиокнопки внутри неё.
QGroupBox *Window::createSecondExclusiveGroup()
{
QGroupBox *groupBox = new QGroupBox(tr("E&xclusive Radio Buttons"));
groupBox->setCheckable(true);
groupBox->setChecked(false);
Групповая рамка содержит три взаимоисключающих радиокнопки и незавимый флажок. В целях непротиворечивости, в любой момент времени должна быть отмечена одна радиокнопка, поэтому мы убеждаемся, что первая радиокнопка первоначально отмечена.
QRadioButton *radio1 = new QRadioButton(tr("Rad&io button 1"));
QRadioButton *radio2 = new QRadioButton(tr("Radi&o button 2"));
QRadioButton *radio3 = new QRadioButton(tr("Radio &button 3"));
radio1->setChecked(true);
QCheckBox *checkBox = new QCheckBox(tr("Ind&ependent checkbox"));
checkBox->setChecked(true);
Кнопки расположены таким же образом, что и в первой групповой рамке.
QVBoxLayout *vbox = new QVBoxLayout;
vbox->addWidget(radio1);
vbox->addWidget(radio2);
vbox->addWidget(radio3);
vbox->addWidget(checkBox);
vbox->addStretch(1);
groupBox->setLayout(vbox);
return groupBox;
}
Третья групповая рамка создана с "плоским" стилем, который лучше подходит для некоторых типов диалогов.
QGroupBox *Window::createNonExclusiveGroup()
{
QGroupBox *groupBox = new QGroupBox(tr("Non-Exclusive Checkboxes"));
groupBox->setFlat(true);
Эта групповая рамка содержит только флажки, поэтому является не исключающей по умолчанию. Это означает, что каждый флажок может быть отмечен независимо от других.
QCheckBox *checkBox1 = new QCheckBox(tr("&Checkbox 1"));
QCheckBox *checkBox2 = new QCheckBox(tr("C&heckbox 2"));
checkBox2->setChecked(true);
QCheckBox *tristateBox = new QCheckBox(tr("Tri-&state button"));
tristateBox->setTristate(true);
Вновь мы используем вертикальную компоновку внутри групповой рамки для размещения кнопок в виде вертикального списка.
QVBoxLayout *vbox = new QVBoxLayout;
vbox->addWidget(checkBox1);
vbox->addWidget(checkBox2);
vbox->addWidget(tristateBox);
vbox->addStretch(1);
groupBox->setLayout(vbox);
return groupBox;
}
Последняя групповая рамка содержит только кнопки и, как вторая групповая рамка, является отмечаемой.
QGroupBox *Window::createPushButtonGroup()
{
QGroupBox *groupBox = new QGroupBox(tr("&Push Buttons"));
groupBox->setCheckable(true);
groupBox->setChecked(true);
Создаём обычную кнопку, триггерную кнопку и плоскую кнопку:
QPushButton *pushButton = new QPushButton(tr("&Normal Button"));
QPushButton *toggleButton = new QPushButton(tr("&Toggle Button"));
toggleButton->setCheckable(true);
toggleButton->setChecked(true);
QPushButton *flatButton = new QPushButton(tr("&Flat Button"));
flatButton->setFlat(true);
Кнопки можно использовать для вывода на экран всплывающих меню. Создадим одну и присоединим к ней простое меню:
QPushButton *popupButton = new QPushButton(tr("Pop&up Button"));
QMenu *menu = new QMenu(this);
menu->addAction(tr("&First Item"));
menu->addAction(tr("&Second Item"));
menu->addAction(tr("&Third Item"));
menu->addAction(tr("F&ourth Item"));
popupButton->setMenu(menu);
В заключение, мы располагаем виджеты вертикально, и возвращаем созданную групповую рамку:
QVBoxLayout *vbox = new QVBoxLayout;
vbox->addWidget(pushButton);
vbox->addWidget(toggleButton);
vbox->addWidget(flatButton);
vbox->addWidget(popupButton);
vbox->addStretch(1);
groupBox->setLayout(vbox);
return groupBox;
}
|