一、QGroupBox 类(组框)
1、 QGroupBox(组框),直接继承自 QWidget 类,因此使用该类创建的对象,可作为窗口使用, 组框在外观上是可见的。
2、 QGroupBox 类(组框),提供了一个顶部带有标题的箱形框架,然后在该框架中可以显示其
他部件,组框的主要作用是把各部件组织在一起,以方便管理。
3、 QGroupBox 不会自动布置组框内的子部件。
4、组框中的子部件可以是任何部件,通常是单选按钮和复选按钮。
5、 QGroupBox 类中的属性
①、 title: QString 访问函数: QString title() const; void setTitle(const QString &);
此属性描述组框的标题文本。
②、 alignment: Qt::Alignment
访问函数: Qt::Alignment alignment()const; void setAlignment(int);
此属性描述组框标题文本的对齐方式,大多数样式都将标题放于组框的顶部。
Qt::Alignment 枚举是用于描述对齐方式的,对于组框标题的水平对齐方式可取
值为: Qt::AlignLeft(左对齐, 默认值)、 Qt::AlignRight (右对齐)、 Qt::AlignHCenter
(居中对齐),
注意:该枚举的设置函数 setAlignment(int)的参数是 int 型,也就是说可以直接使
用 Qt::Alignment 枚举所代表的整数值来指定对齐方式。 比如 setAlignment (1) ;
表示左对齐。
③、 checkable: bool 访问函数: bool isCheckable() const; void setCheckable (bool);
此属性用于描述组框的标题是否具有复选框(见右图),即组框是否可被选中,若该属性为 true,当取消选中标题的复选框时,
组框中的子部件都会被禁用。默认为 false(即不可被选中)
④、 checked: bool 访问函数: bool isChecked() const; void setChecked (bool);
该属性描述组框是否被选中,使用此属性需要启用 checkable 属性。 默认为 true。
⑤、 flat: bool 访问函数: bool isFlat() const; void setFlat (bool);
此属性描述组框是否具有边框,若此属性为 true,则只绘制组框顶部的边框(见右图),也就是说组框左、右和下侧的边框不会被绘制。默认为 false(禁用)。
注意:在某些样式中,有边框和无边框可能具有相似的形式。
6、 QGroupBox 类中的构造函数和信号
①、 QGroupBox (QWidget* parent = Q_NULLPTR); //构造函数
QGroupBox (const QString &title , QWidget* parent = Q_NULLPTR); //构造函数
②、 void clicked (bool checked = false); //信号
发送时机同其他 clicked 信号,但要注意:若调用 setChecked()发不会发送该信号。
③、 void toggled (bool on); //信号
若组框是可被选中的,则在组框的状态被切换时发送该信号,若组选被选中,则 on
为 true,否则为 false。
7、该类没有其他特别的成员函数。
- #include<QtWidgets>
- #include <iostream>
- using namespace std;
- int main(int argc, char *argv[]) {
- QApplication a(argc, argv);
- QWidget w;
- //组框
- QGroupBox *box = new QGroupBox(&w); box->move(33, 33); box->resize(120, 150);
- QGroupBox *box1 = new QGroupBox(&w); box1->move(165, 33); box1->resize(110, 75);
- //按钮组
- QButtonGroup *b = new QButtonGroup;
-
- //把按钮加入到组框 QGroupBox *box,QGroupBox *box1中
- QRadioButton *rb1 = new QRadioButton("AAA", box);
- QRadioButton *rb2 = new QRadioButton("BBB", box);
- QCheckBox *cb1 = new QCheckBox("CCC", box);
- QCheckBox *cb2 = new QCheckBox("DDD", box);
- QCheckBox *cb3 = new QCheckBox("EEE", box1);
- QCheckBox *cb4 = new QCheckBox("FFF", box1);
-
- //将属于同一组的按钮加入到按钮组b:(和组框无关,只是按钮组属性!)
- //1.不加入按钮组b:不具有排他性(可以多选)
- //b->addButton(rb1); b->addButton(rb2); b->addButton(cb1, 2); b->addButton(cb2);
- //2.加入按钮组b:具有排他性(只能选中按钮组中的一个按钮)
- b->addButton(rb1); b->addButton(rb2); b->addButton(cb1, 2); b->addButton(cb2);
- //布局组框 box 中的子部件
- rb1->move(22, 22); rb2->move(22, 50); cb1->move(22, 77); cb2->move(22, 105);
- //布局组框 box1 中的子部件
- cb3->move(22, 11); cb4->move(22, 40);
-
- //重点!和组框相关
- box->setTitle("XXXXX"); //设置标题
- box->setAlignment(Qt::AlignHCenter); //居中显示标题
- box->setCheckable(true); //组框 box 可被选中
- box1->setFlat(true); //组框 box1 无边框
-
- w.resize(300, 200); w.show(); return a.exec();
- }
运行结果及说明
按钮组:QButtonGroup、组框:QGroupBox;
二、 QButtonGroup 类(按钮组)
1、为方便讲解,本文把由 QButtonGroup 类创建的对象称为按钮组。
2、 QButtonGroup 继承自 QObject 类, 因此该类创建的不是一个窗口, 使用该类创建的对象
是不可见的,即从外观上无法分辨哪些按钮是一组的。 该类提供了一个容器,用于组织按
钮部件(即可以把按钮放于该容器内),这样可以方便管理组中的每个按钮,通常见到的就
是把单选按钮放于一组按钮组中。
3、默认情况下,按钮组是具有排他性的或称为是独占的,即在任何时候只能选中按钮组中的
一个按钮, 选中一个按钮会取消其他已选中的按钮。
4、按钮组中的按钮通常是可被选中的按钮, QCheckBox(复选按钮)通常用于非排他性组。
5、排他性按钮组的特点:
在排他性按钮组中,用户不能通过点击来取消当前已经被选中的按钮,
在排他性按钮组中,当前选中的按钮可使用 checkedButton()获取
创建了一个排他性按钮组,则在初始状态时应选中组中的一个按钮,否则组中的按
钮在初始状态时将没有按钮被选中。
6、 单击一个按钮,会发送 buttonClicked()信号,若该按钮是独占组中的可选中按钮,则意味
着,该按钮已被选中。
7、 QButtonGroup 还可在整数和按钮间进行映射,可使用 setId()函数,把一个整数 id 分配给
一个按钮,并使用 id()检索它。当前被选中的按钮的 id,可使用 checkedId()函数获取,并
且有一个重载的信号 buttonClicked()发出按钮的 id。 id-1 是 QButtonGroup 保留的,意思是
“没有这样的按钮”。
8、 QButtonGroup 类中的属性和信号
①、 exclusive: bool 访问函数: bool exclusive() const; void setExclusive(bool);
该属性描述按钮组是否具有排他性,默认为 true(即具有排他性)
②、 void buttonClicked(QAbstractButton* button); //信号
void buttonClicked(int id); //信号
以下情形会发送以上信号:按下按钮然后释放时,键入快捷键时,调用
QQAbstractButton::Click()或 QAbstractButton::animateClick()时。
③、 void buttonPressed(QAbstractButton* button); //信号
void buttonPressed(int id); //信号
当按下按钮时发送以上信号
④、 void buttonReleased(QAbstractButton* button); //信号
void buttonReleased(int id); //信号
当释放按钮时发送以上信号
⑤、 void buttonToggled(QAbstractButton* button, bool checked); //信号, qt5.2
void buttonToggled(int id , bool checked); //信号, qt5.2
当按钮被切换时发送以上信号,若按钮被选中,则 checked 为 true,若未选中,则为
false。
9、 QButtonGroup 类中的函数
①、 QButtonGroup(QObject* parent = Q_NULLPTR); //构造函数:
②、 void addButton (QAbstractButton* button, int id= -1);
将给定的按钮 button 添加到按钮组中。 若 id 为-1,则会自动分配 id 给按钮, 自动分
配的 id 从-2 开始,保证为负值。 若要分配自己的 id,请使用正值以避免冲突。
③、 void setId(QAbstractButton* button , int id); 设置按钮 button 的 id,注意 id 不能为-1。
④、 void removeButton(QAbstractButton* button); 从按钮组中删除按钮 button
⑤、 int id(QAbstractButton* button) const;
返回按钮 button 的 id,若不存在这样的按钮,则返回-1。
⑥、 QAbstractButton* button(int id) const; 返回指定 id 的按钮,若该按钮不存在,则返回 0。
⑦、 QList
⑧、 QAbstractButton* checkedButton() const;
返回按钮组中被选中的按钮,若没有按钮被选中,则为 0。
⑨、 int checkedId() const;
返回被选中的按钮的 id,若没有按钮被选中,则为-1。
⑩、 注意: 要获取按钮所属的按钮组,需使用 QAbstractButton::group()函数。
- //m.h 文件的内容
- #ifndef M_H
- #define M_H
- #include<QtWidgets>
- #include <iostream>
- using namespace std;
- class B :public QButtonGroup {
- Q_OBJECT
- public slots:
- void f(QAbstractButton* b) {
- int i = id(b); //获取按钮 b 的 id
- QAbstractButton* c = checkedButton(); //获取当前被选中的按钮
- cout << "id=" << i << endl;
- cout << "button=" << c->objectName().toStdString() << endl;
- }
- };
- #endif // M_H
-
-
- //m.cpp 文件的内容
- #include "m.h"
- int main(int argc, char *argv[]) {
- QApplication a(argc, argv);
- QWidget w; B *b = new B; //创建按钮组
- QRadioButton *rb1 = new QRadioButton("AAA", &w);
- QRadioButton *rb2 = new QRadioButton("BBB", &w);
- QCheckBox *cb1 = new QCheckBox("CCC", &w); QCheckBox *cb2 = new QCheckBox("DDD", &w);
- QCheckBox *cb3 = new QCheckBox("EEE", &w);
- //设置对象名。
- rb1->setObjectName("AAA"); rb2->setObjectName("BBB");
- cb1->setObjectName("CCC"); cb2->setObjectName("DDD"); cb3->setObjectName("EEE");
-
- //把按钮添加到按钮组 b 之中
- b->addButton(rb1); //未指定 id,默认为-2
- b->addButton(rb2); //未指定 id,默认为-3(默认值依次递减)
- b->addButton(cb1, 2); //指定 id 为 2
- b->addButton(cb2); //未指定 id,此时默认为-4(默认值依次递减)
- b->setId(cb2, 3); //把 cb2 的 id 设置为 3。
-
- //布局按钮
- rb1->move(22, 22); rb2->move(22, 50); cb1->move(22, 77);
- cb2->move(22, 105); cb3->move(99, 22);
- //关联信号和槽
- QObject::connect(b, SIGNAL(buttonClicked(QAbstractButton*)), b, SLOT(f(QAbstractButton*)));
-
- w.resize(300, 200); w.show(); return a.exec();
- }
结果说明: