「Qt Widget中文示例指南」如何實現一個分組框

Qt 是目前先進、完整的跨平臺C++開發工具。它不僅完全實現了一次編寫,所有平臺無差別運行,更提供了幾乎所有開發過程中需要用到的工具。如今,Qt已被運用於超過70個行業、數千家企業,支持數百萬設備及應用。

Group Box(分組框)示例展示瞭如何在Qt中使用不同類型的分組框。Group Box(分組框)是容器小部件,可以在邏輯上和屏幕上將按鈕組織成組,它們管理用戶和應用程序之間的交互,因此您不必強制執行簡單的約束。

分組框通常用於將複選框和單選按鈕組織到排他性組中。

「Qt Widget中文示例指南」如何實現一個分組框

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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章