「Qt Widget中文示例指南」如何实现一个分组框

📅 2026/7/21 16:14:01
「Qt Widget中文示例指南」如何实现一个分组框
Qt是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写所有平台无差别运行更提供了几乎所有开发过程中需要用到的工具。如今Qt已被运用于超过70个行业、数千家企业支持数百万设备及应用。Group Box分组框示例展示了如何在Qt中使用不同类型的分组框。Group Box分组框是容器小部件可以在逻辑上和屏幕上将按钮组织成组它们管理用户和应用程序之间的交互因此您不必强制执行简单的约束。分组框通常用于将复选框和单选按钮组织到排他性组中。Group Boxes示例包含一个单一的Window类用于显示四个分组框一个独占的单选按钮组、一个非独占的复选框组、一个具有启用复选框的独占单选按钮组以及一个具有普通按钮的组框。Window类定义Window类是QWidget的一个子类用于显示多个分组框。类定义包含构造每个分组框的函数并用不同选择的按钮部件填充它class Window : public QWidget { Q_OBJECT public: Window(QWidget *parent nullptr); 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(Radio button 2)); QRadioButton *radio3 new QRadioButton(tr(Radio 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(Exclusive Radio Buttons)); groupBox-setCheckable(true); groupBox-setChecked(false);分组框包含三个互斥的单选按钮和一个独立的复选框为了保持一致性必须始终选中一个单选按钮因此我们确保首先选中第一个按钮。QRadioButton *radio1 new QRadioButton(tr(Radio button 1)); QRadioButton *radio2 new QRadioButton(tr(Radio button 2)); QRadioButton *radio3 new QRadioButton(tr(Radio button 3)); radio1-setChecked(true); QCheckBox *checkBox new QCheckBox(tr(Independent 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(Checkbox 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);Push按钮可以用来显示弹出式菜单我们创建一个并附加一个简单的菜单QPushButton *popupButton new QPushButton(tr(Popup Button)); QMenu *menu new QMenu(this); menu-addAction(tr(First Item)); menu-addAction(tr(Second Item)); menu-addAction(tr(Third Item)); menu-addAction(tr(Fourth 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; }