对于QGroupBox常用于作为一个容器来包含其他控件,因为在界面的控件比较多的时候我们需要对其进行区域划分,那么QGroupBox就派上用场了,让其包含子控件做为一个区域,其他的在利用其他容器或或者使用布局管理器来对整体的界面进行调整,这样做的好处就是显得界面非常的整洁,而不是杂乱无章。一般情况在QGroupBox中所包含的控件有button、checkbox、spinBox、label等,但是其中包含多个spinbox的时候他们之间是互斥的,即同一时刻只能选择一个。本节主要实现的是结合QGroupBox和布局管理器来管理界面的控件。
QGroupBox *createFirstExclusiveGroup();
QGroupBox *createSecondExclusiveGroup();
QGroupBox *createNonExclusiveGroup();
QGroupBox *createPushButtonGroup();
首先我们创建四个私有的成员函数,它们只要是现实四个QGroupBox的创建以及内部子控件的布局。
QGroupBox *GroupWidget::createFirstExclusiveGroup()
{
QGroupBox *groupBox = new QGroupBox(tr("Exclusive Radio Buttons"));
groupBox->setAlignment(Qt::AlignLeft);
QRadioButton *radio1 = new QRadioButton(tr("Radio1"));
QRadioButton *radio2 = new QRadioButton(tr("Radio2"));
QRadioButton *radio3 = new QRadioButton(tr("Radio3"));
QVBoxLayout *vlayout = new QVBoxLayout();
vlayout->addWidget(radio1);
vlayout->addWidget(radio2);
vlayout->addWidget(radio3);
groupBox->setLayout(vlayout);
return groupBox;
}
我们创建一个QGroupBox对象,使用setAlignment()来调整标题的位置,默认情况下标题与QGroupBox的左侧边框对其,所以我们这里不设置其标题的位置,那么它也是显示在左边的。接下来在其内部创建三个radioButton,他们之间是互斥的。
QGroupBox *GroupWidget::createSecondExclusiveGroup()
{
QGroupBox *groupBox= new QGroupBox(tr("Exclusive Radio Buttons"));
groupBox->setAlignment(Qt::AlignRight);
groupBox->setCheckable(true);
groupBox->setChecked(false);
QRadioButton *radio1 = new QRadioButton(tr("Radio1"));
radio1->setChecked(true);
QRadioButton *radio2 = new QRadioButton(tr("Radio2"));
QRadioButton *radio3 = new QRadioButton(tr("Radio3"));
QCheckBox *checkBox = new QCheckBox(tr("Indepent checkBox"));
checkBox->setChecked(true);
QVBoxLayout *vlayout = new QVBoxLayout();
vlayout->addWidget(radio1);
vlayout->addWidget(radio2);
vlayout->addWidget(radio3);
vlayout->addWidget(checkBox);
groupBox->setLayout(vlayout);
return groupBox;
}
在创建QGrroupBox对象完成后我们设置其标题与右侧边框对其,同时使用checkbale属性,即意味着将会使用checkbox来代替普通的label来显示标题,接着讲checked属性设置为false,即其内部的的子控件是disbale的。只有将标题栏中的checkbox选中之后其内部的部件变成able。
QGroupBox *GroupWidget::createNonExclusiveGroup()
{
QGroupBox *groupBox = new QGroupBox(tr("Non-Exclusive Checkboxes"));
groupBox->setFlat(true);
groupBox->setAlignment(Qt::AlignCenter);
QCheckBox *checkbox1 = new QCheckBox(tr("checkbox1"));
QCheckBox *checkbox2 = new QCheckBox(tr("checkbox2"));
QCheckBox *checkbox3 = new QCheckBox(tr("checkbox3"));
checkbox3->setTristate(true);
QVBoxLayout *vlayout = new QVBoxLayout();
vlayout->addWidget(checkbox1);
vlayout->addWidget(checkbox2);
vlayout->addWidget(checkbox3);
groupBox->setLayout(vlayout);
return groupBox;
}
设置使用QGroupBox的flat属性,即意味着只绘制上边框,同时设置其标题位于上边框的中心位置, 一个checkBox有三种状态:未选择、部分选中、选中,要想使用这种checkbox可以通过setTristate()来实现。当QGroupBox中只包含checkBox的时候它们之间不存在互斥关系。
QGroupBox *GroupWidget::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("Frist"));
menu->addAction(tr("Second"));
menu->addAction(tr("Third"));
popupButton->setMenu(menu);
QVBoxLayout *vlayout = new QVBoxLayout();
vlayout->addWidget(pushButton);
vlayout->addWidget(toggleButton);
vlayout->addWidget(flatButton);
vlayout->addWidget(popupButton);
groupBox->setLayout(vlayout);
return groupBox;
}
此函数创建内部包含button的groupBox,我们可以设置button为可选中的状态,然后设置该按钮为选中。同时如果我们不想要按钮的边框的话我们可以使用setflat()来设置。可以给按钮添加菜单栏,我们都知道在创建菜单栏的时候通常需要action。
QGridLayout *mainLayout = new QGridLayout(this);
mainLayout->addWidget(createFirstExclusiveGroup(),0,0);
mainLayout->addWidget(createNonExclusiveGroup(),0,1);
mainLayout->addWidget(createSecondExclusiveGroup(),1,0);
mainLayout->addWidget(createPushButtonGroup(),1,1);
setLayout(mainLayout);
setWindowTitle(tr("GroupBox"));
使用QGridlayout来对整体进行布局。其整体效果如下: