• Qt学习总结之单选框QRadioButton和QButtonGroup


    一.单选框QRadioButton的使用

    1.类的描述

    a.单选框按钮用于给用户提供若干选项中的单选操作,当一个被选中时,会自动取消选中的那个。(如果只有一个时可以通过单击该按钮改变其状态;而存在多个按钮时单击选中的按钮无法改变其状态)

    b.单选按钮左侧会有一个圆形的图标来表示按钮被选中

    c.QRadioButton继承了QAbstractButton类,具有父类所有的API。

    QRadioButton类中的常用方法如下所示:

    方法描述
    setCheckable()设置按钮是否被选中,可以改变单选钮的选中状态,如果设置为True,则表示单选钮将保持已点击或释放状态。
    isChecked()返回单选按钮的状态。设置返回值True或False
    setText()设置单选按钮的显示文本
    text()返回单选钮的显示文本

    在QRadioButton中,toggled信号是在切换单选状态按钮状态(开、关)时发射的,而clicked信号则在每次点击单选钮时都会发射。在实际中,一般只有状态改变时,才有必要去响应,因此,toggled信号更适合用于状态监控。

    2.创建

    创建的方法和PushButton按钮的创建方式是一样的

    QRadioButton *button = new QRadioButton("Search from the &cursor", this);
    
    • 1

    这个示例中,快捷键为Alt+c。关于更多快捷键的内容请参考:QShortcut 。如果要显示一个“&”,请使用’&&’。

    3.信号

    connect(button ,&QRadioButton::toggled,this,&MainWindow::slot_radio1);
    
    • 1

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    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!";
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    4、解决radio互斥问题

    我们在讲QAbstractButton类时讲过按钮的互斥这个问题:在一个父控件内按钮是可以互斥的,但是如果存在多组的互斥怎么办?我们可以建立多个父控件

    这样就可以使用多种互斥按钮了,可是每次添加这种控件比较麻烦,还要处理视觉上是否可见或遮挡其他控件的问题,那么就引出了下面的这个类——QButtonGroup

    二.QButtonGroup

    1.描述

    a.QButtonGroup提供了一个抽象的按钮容器,可以将按钮划分为一组。

    b.QButtonGroup是继承自QObject,不具备可视化的效果。

    c.一般QButtonGroup定义的组存放的都是可以被Checked的按钮。

    2.建立按钮组,并将按钮存放在组内

    QButtonGroup *group1 = new QButtonGroup(this);
    QButtonGroup *group2 = new QButtonGroup(this);
    
    • 1
    • 2

    3.属性

    exclusive : bool

    该属性保持按钮组是否是独占的。

    如果此属性为true,则在任何给定时间只能检查组中的一个按钮。 用户可以点击任何按钮来检查它,并且该按钮将替换现有的按钮作为组中的选中按钮。

    在专属组中,用户不能通过点击来取消当前选中的按钮; 相反,组中的另一个按钮必须被点击以设置该组的新选中按钮。

    默认情况下,该属性为true。

    访问函数;

    bool exclusive() const
    void setExclusive(bool)
    
    • 1
    • 2

    4、成员函数

    1、用给定的父项构造一个新的空按钮组。

    QButtonGroup::QButtonGroup(QObject *parent = Q_NULLPTR)
    
    • 1

    2、销毁按钮组。

    QButtonGroup::~QButtonGroup()
    
    • 1

    3、将给定的按钮添加到按钮组。 如果id为-1,则将为该按钮分配一个id。 自动分配的ID保证为负数,从-2开始。 如果您正在分配自己的ID,请使用正值来避免冲突。

    void QButtonGroup::addButton(QAbstractButton *button, int id = -1)
    
    • 1

    4、返回具有指定ID的按钮,如果不存在此按钮,则返回0。

    这个函数是在Qt 4.1中引入的。

    QAbstractButton *QButtonGroup::button(int id) const
    
    • 1

    5、点击给定按钮时会发出此信号。 当第一次按下然后释放按钮时,当它的快捷键被键入时,或者以编程方式调用QAbstractButton :: click()或QAbstractButton :: animateClick()时,会单击一个按钮。

    [signal] void QButtonGroup::buttonClicked(QAbstractButton *button)
    
    • 1

    注意:此类中的信号buttonClicked已被重载。 要使用函数指针语法连接到此函数,您必须在静态转换中指定信号类型,如下例所示:

    connect(buttonGroup, static_cast(&QButtonGroup::buttonClicked),
          [=](QAbstractButton *button){ /* ... */ });
    
    • 1
    • 2

    6、点击具有给定ID的按钮时会发出此信号。

    [signal] void QButtonGroup::buttonClicked(int id)
    
    • 1

    注意:此类中的信号buttonClicked已被重载。 要使用函数指针语法连接到此函数,您必须在静态转换中指定信号类型,如下例所示:

      connect(buttonGroup, static_cast(&QButtonGroup::buttonClicked),
          [=](int id){ /* ... */ });
    
    • 1
    • 2

    7、按下给定按钮时发出此信号。

    [signal] void QButtonGroup::buttonPressed(QAbstractButton *button)
    
    • 1

    注意:此类中的信号buttonPressed被重载。 要使用函数指针语法连接到此函数,您必须在静态转换中指定信号类型,如下例所示:

      connect(buttonGroup, static_cast(&QButtonGroup::buttonPressed),
          [=](QAbstractButton *button){ /* ... */ });
    
    • 1
    • 2

    这个函数是在Qt 4.2中引入的。

    8、当具有给定ID的按钮被按下时,该信号被发射。

    [signal] void QButtonGroup::buttonPressed(int id)
    
    • 1

    注意:此类中的信号buttonPressed被重载。 要使用函数指针语法连接到此函数,您必须在静态转换中指定信号类型,如下例所示:

      connect(buttonGroup, static_cast(&QButtonGroup::buttonPressed),
          [=](int id){ /* ... */ });
    
    • 1
    • 2

    这个函数是在Qt 4.2中引入的。

    9、当给定的按钮被释放时,该信号被发射。

    [signal] void QButtonGroup::buttonReleased(QAbstractButton *button)
    
    • 1

    注意:此类中的信号buttonReleased被重载。 要使用函数指针语法连接到此函数,您必须在静态转换中指定信号类型,如下例所示:

      connect(buttonGroup, static_cast(&QButtonGroup::buttonReleased),
          [=](QAbstractButton *button){ /* ... */ });
    
    • 1
    • 2

    这个函数是在Qt 4.2中引入的。

    10、当具有给定ID的按钮被释放时,该信号被发射。

    [signal] void QButtonGroup::buttonReleased(int id)
    
    • 1

    注意:此类中的信号buttonReleased被重载。 要使用函数指针语法连接到此函数,您必须在静态转换中指定信号类型,如下例所示:

      connect(buttonGroup, static_cast(&QButtonGroup::buttonReleased),
          [=](int id){ /* ... */ });
    
    • 1
    • 2

    这个函数是在Qt 4.2中引入的。

    11、当给定的按钮被切换时,该信号被发射。 如果按钮被选中,则检查为true;如果未选中该按钮,则检查为false。

    [signal] void QButtonGroup::buttonToggled(QAbstractButton *button, bool checked)
    
    • 1

    注意:此类中的信号buttonToggled超载。 要使用函数指针语法连接到此函数,您必须在静态转换中指定信号类型,如下例所示:

      connect(buttonGroup, static_cast(&QButtonGroup::buttonToggled),
          [=](QAbstractButton *button, bool checked){ /* ... */ });
    
    • 1
    • 2

    这个函数是在Qt 5.2中引入的。

    12、当具有给定ID的按钮被切换时,该信号被发射。 如果按钮被选中,则检查为true;如果未选中该按钮,则检查为false。

    [signal] void QButtonGroup::buttonToggled(int id, bool checked)
    
    • 1

    注意:此类中的信号buttonToggled超载。 要使用函数指针语法连接到此函数,您必须在静态转换中指定信号类型,如下例所示:

      connect(buttonGroup, static_cast(&QButtonGroup::buttonToggled),
          [=](int id, bool checked){ /* ... */ });
    
    • 1
    • 2

    这个函数是在Qt 5.2中引入的。

    13、返回按钮组的按钮列表。 这可能是空的。

    QList QButtonGroup::buttons() const
    
    • 1

    14、返回按钮组的选中按钮,如果没有按钮被选中,则返回0。

    QAbstractButton *QButtonGroup::checkedButton() const
    
    • 1

    15、返回checkedButton()的id,如果没有选中按钮,则返回-1。

    int QButtonGroup::checkedId() const
    
    • 1

    这个函数是在Qt 4.1中引入的。

    16、返回指定按钮的ID,如果不存在此按钮,则返回-1。

    int QButtonGroup::id(QAbstractButton *button) const
    
    • 1

    这个函数是在Qt 4.1中引入的。

    17、从按钮组中删除给定的按钮。

    void QButtonGroup::removeButton(QAbstractButton *button)
    
    • 1

    18、设置指定按钮的ID。 请注意,ID不能是-1。

    void QButtonGroup::setId(QAbstractButton *button, int id)
    
    • 1

    这个函数是在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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    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!";
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
  • 相关阅读:
    数据结构之栈:使用栈数据结构实现字符串中相邻两个字符不重复
    .net 项目静态文件自动压缩打包
    OpenGL 的学习之路-4(变换)
    java发送钉钉群
    斯坦福机器学习 Lecture2 (假设函数、参数、样本等等术语,还有批量梯度下降法、随机梯度下降法 SGD 以及它们的相关推导,还有正态方程)
    单一职责原则
    找游戏外包开发游戏,有哪些好处呢?
    跨域 —— 反向代理配置
    aop注解快速实现数据脱敏返回
    基于阶梯式Tent混沌和模拟退火的樽海鞘群算法
  • 原文地址:https://blog.csdn.net/qq_27726087/article/details/126240344