a.单选框按钮用于给用户提供若干选项中的单选操作,当一个被选中时,会自动取消选中的那个。(如果只有一个时可以通过单击该按钮改变其状态;而存在多个按钮时单击选中的按钮无法改变其状态)
b.单选按钮左侧会有一个圆形的图标来表示按钮被选中
c.QRadioButton继承了QAbstractButton类,具有父类所有的API。
QRadioButton类中的常用方法如下所示:
| 方法 | 描述 |
|---|---|
| setCheckable() | 设置按钮是否被选中,可以改变单选钮的选中状态,如果设置为True,则表示单选钮将保持已点击或释放状态。 |
| isChecked() | 返回单选按钮的状态。设置返回值True或False |
| setText() | 设置单选按钮的显示文本 |
| text() | 返回单选钮的显示文本 |
在QRadioButton中,toggled信号是在切换单选状态按钮状态(开、关)时发射的,而clicked信号则在每次点击单选钮时都会发射。在实际中,一般只有状态改变时,才有必要去响应,因此,toggled信号更适合用于状态监控。
创建的方法和PushButton按钮的创建方式是一样的
QRadioButton *button = new QRadioButton("Search from the &cursor", this);
这个示例中,快捷键为Alt+c。关于更多快捷键的内容请参考:QShortcut 。如果要显示一个“&”,请使用’&&’。
connect(button ,&QRadioButton::toggled,this,&MainWindow::slot_radio1);
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include
#include
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void slot_radio1();
private:
Ui::MainWindow *ui;
QRadioButton *bt1;
QRadioButton *bt2;
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include
#include
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
this->resize(800,600);
bt1 = new QRadioButton("radio1",this);
bt2 = new QRadioButton("radio2",this);
bt1->setGeometry(100,200,60,20);
bt2->setGeometry(200,200,60,20);
connect(bt1,&QRadioButton::toggled,this,&MainWindow::slot_radio1);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::slot_radio1()
{
if(bt1->isChecked()){
qDebug()<<"test radio push!";
}else{
qDebug()<<"test radio up!";
}
}
我们在讲QAbstractButton类时讲过按钮的互斥这个问题:在一个父控件内按钮是可以互斥的,但是如果存在多组的互斥怎么办?我们可以建立多个父控件
这样就可以使用多种互斥按钮了,可是每次添加这种控件比较麻烦,还要处理视觉上是否可见或遮挡其他控件的问题,那么就引出了下面的这个类——QButtonGroup。
a.QButtonGroup提供了一个抽象的按钮容器,可以将按钮划分为一组。
b.QButtonGroup是继承自QObject,不具备可视化的效果。
c.一般QButtonGroup定义的组存放的都是可以被Checked的按钮。
QButtonGroup *group1 = new QButtonGroup(this);
QButtonGroup *group2 = new QButtonGroup(this);
exclusive : bool
该属性保持按钮组是否是独占的。
如果此属性为true,则在任何给定时间只能检查组中的一个按钮。 用户可以点击任何按钮来检查它,并且该按钮将替换现有的按钮作为组中的选中按钮。
在专属组中,用户不能通过点击来取消当前选中的按钮; 相反,组中的另一个按钮必须被点击以设置该组的新选中按钮。
默认情况下,该属性为true。
访问函数;
bool exclusive() const
void setExclusive(bool)
1、用给定的父项构造一个新的空按钮组。
QButtonGroup::QButtonGroup(QObject *parent = Q_NULLPTR)
2、销毁按钮组。
QButtonGroup::~QButtonGroup()
3、将给定的按钮添加到按钮组。 如果id为-1,则将为该按钮分配一个id。 自动分配的ID保证为负数,从-2开始。 如果您正在分配自己的ID,请使用正值来避免冲突。
void QButtonGroup::addButton(QAbstractButton *button, int id = -1)
4、返回具有指定ID的按钮,如果不存在此按钮,则返回0。
这个函数是在Qt 4.1中引入的。
QAbstractButton *QButtonGroup::button(int id) const
5、点击给定按钮时会发出此信号。 当第一次按下然后释放按钮时,当它的快捷键被键入时,或者以编程方式调用QAbstractButton :: click()或QAbstractButton :: animateClick()时,会单击一个按钮。
[signal] void QButtonGroup::buttonClicked(QAbstractButton *button)
注意:此类中的信号buttonClicked已被重载。 要使用函数指针语法连接到此函数,您必须在静态转换中指定信号类型,如下例所示:
connect(buttonGroup, static_cast(&QButtonGroup::buttonClicked),
[=](QAbstractButton *button){ /* ... */ });
6、点击具有给定ID的按钮时会发出此信号。
[signal] void QButtonGroup::buttonClicked(int id)
注意:此类中的信号buttonClicked已被重载。 要使用函数指针语法连接到此函数,您必须在静态转换中指定信号类型,如下例所示:
connect(buttonGroup, static_cast(&QButtonGroup::buttonClicked),
[=](int id){ /* ... */ });
7、按下给定按钮时发出此信号。
[signal] void QButtonGroup::buttonPressed(QAbstractButton *button)
注意:此类中的信号buttonPressed被重载。 要使用函数指针语法连接到此函数,您必须在静态转换中指定信号类型,如下例所示:
connect(buttonGroup, static_cast(&QButtonGroup::buttonPressed),
[=](QAbstractButton *button){ /* ... */ });
这个函数是在Qt 4.2中引入的。
8、当具有给定ID的按钮被按下时,该信号被发射。
[signal] void QButtonGroup::buttonPressed(int id)
注意:此类中的信号buttonPressed被重载。 要使用函数指针语法连接到此函数,您必须在静态转换中指定信号类型,如下例所示:
connect(buttonGroup, static_cast(&QButtonGroup::buttonPressed),
[=](int id){ /* ... */ });
这个函数是在Qt 4.2中引入的。
9、当给定的按钮被释放时,该信号被发射。
[signal] void QButtonGroup::buttonReleased(QAbstractButton *button)
注意:此类中的信号buttonReleased被重载。 要使用函数指针语法连接到此函数,您必须在静态转换中指定信号类型,如下例所示:
connect(buttonGroup, static_cast(&QButtonGroup::buttonReleased),
[=](QAbstractButton *button){ /* ... */ });
这个函数是在Qt 4.2中引入的。
10、当具有给定ID的按钮被释放时,该信号被发射。
[signal] void QButtonGroup::buttonReleased(int id)
注意:此类中的信号buttonReleased被重载。 要使用函数指针语法连接到此函数,您必须在静态转换中指定信号类型,如下例所示:
connect(buttonGroup, static_cast(&QButtonGroup::buttonReleased),
[=](int id){ /* ... */ });
这个函数是在Qt 4.2中引入的。
11、当给定的按钮被切换时,该信号被发射。 如果按钮被选中,则检查为true;如果未选中该按钮,则检查为false。
[signal] void QButtonGroup::buttonToggled(QAbstractButton *button, bool checked)
注意:此类中的信号buttonToggled超载。 要使用函数指针语法连接到此函数,您必须在静态转换中指定信号类型,如下例所示:
connect(buttonGroup, static_cast(&QButtonGroup::buttonToggled),
[=](QAbstractButton *button, bool checked){ /* ... */ });
这个函数是在Qt 5.2中引入的。
12、当具有给定ID的按钮被切换时,该信号被发射。 如果按钮被选中,则检查为true;如果未选中该按钮,则检查为false。
[signal] void QButtonGroup::buttonToggled(int id, bool checked)
注意:此类中的信号buttonToggled超载。 要使用函数指针语法连接到此函数,您必须在静态转换中指定信号类型,如下例所示:
connect(buttonGroup, static_cast(&QButtonGroup::buttonToggled),
[=](int id, bool checked){ /* ... */ });
这个函数是在Qt 5.2中引入的。
13、返回按钮组的按钮列表。 这可能是空的。
QList QButtonGroup::buttons() const
14、返回按钮组的选中按钮,如果没有按钮被选中,则返回0。
QAbstractButton *QButtonGroup::checkedButton() const
15、返回checkedButton()的id,如果没有选中按钮,则返回-1。
int QButtonGroup::checkedId() const
这个函数是在Qt 4.1中引入的。
16、返回指定按钮的ID,如果不存在此按钮,则返回-1。
int QButtonGroup::id(QAbstractButton *button) const
这个函数是在Qt 4.1中引入的。
17、从按钮组中删除给定的按钮。
void QButtonGroup::removeButton(QAbstractButton *button)
18、设置指定按钮的ID。 请注意,ID不能是-1。
void QButtonGroup::setId(QAbstractButton *button, int id)
这个函数是在Qt 4.1中引入的。
用QButtonGroup实现QRadioButton的两两互斥,demo如下:
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include
#include
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void slot_radio1();
private:
Ui::MainWindow *ui;
QRadioButton *bt1;
QRadioButton *bt2;
QRadioButton *bt3;
QRadioButton *bt4;
};
#endif // MAINWINDOW_H
mainwindow.c
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include
#include
#include
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
this->resize(800,600);
QButtonGroup *group1 = new QButtonGroup(this);
QButtonGroup *group2 = new QButtonGroup(this);
bt1 = new QRadioButton("radio1",this);
bt2 = new QRadioButton("radio2",this);
bt3 = new QRadioButton("radio3",this);
bt4 = new QRadioButton("radio4",this);
bt1->setGeometry(100,200,60,20);
bt2->setGeometry(200,200,60,20);
bt3->setGeometry(100,250,60,20);
bt4->setGeometry(200,250,60,20);
group1->addButton(bt1,0);
group1->addButton(bt2,1);
connect(bt1,&QRadioButton::toggled,this,&MainWindow::slot_radio1);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::slot_radio1()
{
if(bt1->isChecked()){
qDebug()<<"test radio push!";
}else{
qDebug()<<"test radio up!";
}
}