# QT学习07：五种按钮控件

category: 后端开发
date: 2023/06/11
status: Published
summary: Qt学习记录：五种按钮 QPushButton，QCommandLinkButton，QRadioButton，QCheckBox，QToolButton，以及QButtonGroup介绍
tags: Qt
type: Post

在这里插入图片描述

---

# 抽象类：**QAbstractButton**

是所有按钮类的祖先。

![Untitled](QT%E5%AD%A6%E4%B9%A007%EF%BC%9A%E4%BA%94%E7%A7%8D%E6%8C%89%E9%92%AE%E6%8E%A7%E4%BB%B6%20687bb1cd77a74d308c948c37840f9ba8/Untitled.png)

**QAbstractButton的信号**：

- void **clicked**(bool checked = false) ： 是否选中按钮
- void **pressed**()： 点击按钮
- void **released**()： 释放按钮
- void **toggled**(bool checked)： 检测**是否被选中**

# QPushButton

**最常用的按钮控件之一。**

构造函数：

设置图标，文本信息，父窗口

```cpp
QPushButton(const QIcon &icon, const QString &text, QWidget *parent = nullptr)
QPushButton(const QString &text, QWidget *parent = nullptr)
QPushButton(QWidget *parent = nullptr)
```

它继承自抽象按钮类：`QAbstractButton`

常用操作：

1. **setCheckable**：设置按钮被选中（默认不会被选中），如果被选中则会触发 **`toggled`** 信号，但是不会触发`**clicked**`，它只有在点击时才会触发。
2. **setFlat**：设置按钮扁平化
3. **setMenu**：为按钮添加菜单
4. **setIcon**，**setShortcut**，**setText**：设置图片，快捷键，文本等

---

示例：

```cpp
void Widget::testPushButton()
{
    auto btn=new QPushButton(style()->standardPixmap(QStyle::SP_DialogCloseButton),"干我",this);

    auto menu=new QMenu(this);
    menu->addMenu("唱跳");
    menu->addMenu("RAP");
    menu->addMenu("篮球");

    //添加按钮菜单
    //btn->setMenu(menu);

    //设置按钮扁平化
    btn->setFlat(true);

    //设置能被选中
    btn->setCheckable(true);

    //检测是否被选中
    connect(btn,&QPushButton::toggled,this,[=](bool checked){qInfo()<<"toggled"<<checked;});
}
```

---

# QToolButton

工具按钮，用于**显示菜单上的小工具**等。

![Untitled](QT%E5%AD%A6%E4%B9%A007%EF%BC%9A%E4%BA%94%E7%A7%8D%E6%8C%89%E9%92%AE%E6%8E%A7%E4%BB%B6%20687bb1cd77a74d308c948c37840f9ba8/Untitled%201.png)

构造函数：

```cpp
QToolButton(QWidget *parent = nullptr)
```

同样继承自抽象按钮类：`QAbstractButton`

常用操作：

1. 具有上面的QPushButton介绍的所有常用操作。
2. **setToolButtonStyle**：设置图标后指定文字和图片的**位置**，来自Qt::ToolButtonStyle
3. **setAutoRaise**：设置按钮的点击**动态效果**
4. **setArrowType**：设置此按钮为**箭头**而不是图标

---

示例：

```cpp
void Widget::testToolButton()
{
    auto btn=new QToolButton(this);
    btn->setText("ToolButton");
    btn->setIcon(style()->standardPixmap(QStyle::SP_ComputerIcon));
    //设置文字与图标显示位置
    btn->setToolButtonStyle(Qt::ToolButtonStyle::ToolButtonTextUnderIcon);

    //btn->setArrowType(Qt::ArrowType::RightArrow); //展现为箭头
    auto menu=new QMenu(this);
    menu->addMenu("唱跳");
    menu->addMenu("RAP");
    menu->addMenu("篮球");
    btn->setMenu(menu);

    //设置按钮菜单弹出模式
    btn->setPopupMode(QToolButton::ToolButtonPopupMode::MenuButtonPopup);
    //设置按钮点击动态效果
    btn->setAutoRaise(true);

}
```

---

# QCommandLinkButton

此按钮用于命令行链接（**进入某链接的按钮**）

![Untitled](QT%E5%AD%A6%E4%B9%A007%EF%BC%9A%E4%BA%94%E7%A7%8D%E6%8C%89%E9%92%AE%E6%8E%A7%E4%BB%B6%20687bb1cd77a74d308c948c37840f9ba8/Untitled%202.png)

构造函数： 

```cpp
QCommandLinkButton(const QString &text, const QString &description, QWidget *parent = nullptr)
QCommandLinkButton(const QString &text, QWidget *parent = nullptr)
QCommandLinkButton(QWidget *parent = nullptr)
```

它继承自：`QPushButton`

常用操作：

1. 具有父类的所有操作
2. **setDescription**：专属的操作，可以设置**描述文本**

```cpp
void Widget::testCommandLinkButton()
{
    auto btn=new QCommandLinkButton("Github",this);
    btn->setDescription("点击跳转到Github");
    connect(btn,&QCommandLinkButton::clicked,this,[](){
        qInfo()<<"正在打开!";
    });
}
```

---

# QRadioButton

**单选框按钮**

![Untitled](QT%E5%AD%A6%E4%B9%A007%EF%BC%9A%E4%BA%94%E7%A7%8D%E6%8C%89%E9%92%AE%E6%8E%A7%E4%BB%B6%20687bb1cd77a74d308c948c37840f9ba8/Untitled%203.png)

构造函数： 

```cpp
QRadioButton(const QString &text, QWidget *parent = nullptr) 
QRadioButton(QWidget *parent = nullptr)
```

同样继承自：`QAbstractButton`

常用操作：

1. 参见上面的QPushButton。

示例：

```cpp
void Widget::testRadioButton(){
    auto btn1=new QRadioButton("男",this);
    auto btn2=new QRadioButton("女",this);
    btn2->move(0,35); 
    btn1->setIcon(QIcon("loginIcon.png"));
}
```

---

# QCheckBox

**复选框，用于多选**

![https://img-blog.csdnimg.cn/0f77f7dc84c8450e9eb90492d74c2c3e.png](https://img-blog.csdnimg.cn/0f77f7dc84c8450e9eb90492d74c2c3e.png)

构造函数：

```cpp
QCheckBox(const QString &text, QWidget *parent = nullptr)
QCheckBox(QWidget *parent = nullptr)
```

复选框具有以下**三种状态**：（三态模式）

1. Qt::check： 选中
2. Qt::Uncheck：未选中
3. Qt::PartiallyChecked：部分选中

特别操作：

1. **setExclusive**：设置为**不排斥状态**，即可以多选，因为这个QCheckBox默认是排斥的，需要手动设置以下。

信号：

```cpp
 void stateChanged(int state)：当复选框的状态发生改变
```

```cpp
void Widget::testcheckButton(){
    auto btn1=new QCheckBox("打篮球",this);
    auto btn2=new QCheckBox("唱",this);
    auto btn3=new QCheckBox("跳",this);
    btn2->move(0,35);
    btn3->move(0,70);
    btn1->setIcon(QIcon("loginIcon.png"));
    //设置三态    
		btn1->setTristate(true); 
    connect(btn1,&QCheckBox::toggled,this,[=](bool check){qInfo()<<check;});
    connect(btn1,&QCheckBox::stateChanged,this,[](int state){
				qInfo()<<Qt::CheckState(state);    
		});}
```

---

# QButtonGroup

**按钮管理类**，可以将所有的按钮放入此类中进行统一管理 它具有每一个按钮的id，以便能够根据id管理每一个按钮。

![Untitled](QT%E5%AD%A6%E4%B9%A007%EF%BC%9A%E4%BA%94%E7%A7%8D%E6%8C%89%E9%92%AE%E6%8E%A7%E4%BB%B6%20687bb1cd77a74d308c948c37840f9ba8/Untitled%204.png)

构造函数：

```cpp
QButtonGroup::QButtonGroup(QObject *parent = nullptr)
```

继承自：`**QObject**`

常用操作：

1. **buttons**：获取该组中的所有按钮，返回的是一个QList
2. **id**：获得编号为id的按钮
3. **setId**：设置按钮编号
4. **addButton**：添加按钮并且设置它在该组中编号

```cpp
void Widget::testButtonGroup()
{
    auto btnSexGroup=new QButtonGroup(this);
    //性别组
    btnSexGroup->addButton(new QRadioButton("男",this),0);
    btnSexGroup->addButton(new QRadioButton("女",this),1);
    btnSexGroup->addButton(new QRadioButton("人妖",this),2);
    btnSexGroup->addButton(new QRadioButton("日本人",this),3);
    auto sexLists=btnSexGroup->buttons(); //获取按钮的所有按钮
    for (int i=0;i<sexLists.size();i++){
        btnSexGroup->button(i)->move(0,i*35);
    }

    //收入组
    auto btnIncomeGroup=new QButtonGroup(this);
    btnIncomeGroup->addButton(new QRadioButton("5k-1w",this),0);
    btnIncomeGroup->addButton(new QRadioButton("1w-2w",this),1);
    btnIncomeGroup->addButton(new QRadioButton("2w-5w",this),2);
    btnIncomeGroup->addButton(new QRadioButton("5w-10w",this),3);
    auto incomeLists=btnSexGroup->buttons(); //获取按钮的所有按钮
    for (int i=0;i<incomeLists.size();i++){
        btnIncomeGroup->button(i)->move(150,i*35);
    }

    //你喜欢的偶像
    auto btnYourLove=new QButtonGroup(this);
    btnYourLove->addButton(new QCheckBox("蔡徐坤",this),0);
    btnYourLove->addButton(new QCheckBox("陈立农",this),1);
    btnYourLove->addButton(new QCheckBox("范丞丞",this),2);
    btnYourLove->addButton(new QCheckBox("王源",this),3);
    btnYourLove->addButton(new QCheckBox("易烊千玺",this),4);
    auto loveLists=btnYourLove->buttons(); //获取按钮的所有按钮
    for (int i=0;i<loveLists.size();i++){
        btnYourLove->button(i)->move(300,i*35);
    }
    //多选按钮默认是排斥的
    qInfo()<<btnYourLove->exclusive(); //true
    btnYourLove->setExclusive(false); //设置不排斥
}
```