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("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);
Push按鈕可以用來顯示彈出式菜單,我們創建一個,並附加一個簡單的菜單:
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; }