【QT按钮类】

一、按钮基类QAbstractButton**

在这里插入图片描述
QT提供的基本按钮控件如下:
在这里插入图片描述

按钮之间继承关系如下:
在这里插入图片描述1.1按钮的文字和图标设置

// 设置按钮文字
void QAbstractButton::setText(const QString &text);
// 获取按钮上显示的文本内容,返回值为QString
QString QAbstractButton::text() const;
// 得到按钮设置的图标
QIcon icon() const;
// 给按钮设置图标
void setIcon(const QIcon &icon);
// 得到按钮图标大小
QSize iconSize() const
// 设置按钮图标的大小
[slot]void setIconSize(const QSize &size);

1.2按钮的check属性
对应按钮来说, 一般有三种常见状态, 分别为: Normal, Hover, Pressed
Normal: 普通状态, 没有和鼠标做任何接触;
Hover: 悬停状态, 鼠标位于按钮之上, 但是并未按下;
Pressed: 按压状态, 鼠标键在按钮上处于按下状态;

  • 默认情况下, 鼠标在按钮上按下, 按钮从 Normal 切换到 Pressed状态, 鼠标释放, 按钮从 Pressed恢复到Normal状态。
  • 当我们给按钮设置了 check 属性之后,情况就有所不同了, 在按钮上释放鼠标键, 按钮依然会处在 Pressed状态, 再次点击按钮, 按钮才能恢复到 Normal 状态。具有check属性的按钮就相当于一个开关, 每点击一次才能实现一次状态的切换。

一组按钮QPUSHBUTTON形成互斥(有且只能选中一个)
调用函数QButtonGround::setExclusive(true)和QPushbutton::setCheckable(true);

1.bool QAbstractButton::isCheckable() const;
// 判断按钮是否设置了checkable属性, 如果设置了点击按钮, 按钮一直处于选中状态
// 默认这个属性是关闭的, not checkable
eg:   qDebug()<<ui->pushButton->isCheckable();//默认false

2.void QAbstractButton::setCheckable(bool);
// 设置按钮的checkable属性
// 参数为true: 点击按钮, 按钮被选中, 松开鼠标, 按钮不弹起
// 参数为false: 点击按钮, 按钮被选中, 松开鼠标, 按钮弹起
eg:   ui->pushButton->setCheckable(true);//点击按钮,鼠标释放后按钮还是选中状态,再次点击按钮,按钮恢复Normal状态。

3. bool QAbstractButton::isChecked() const;   
// 判断按钮是不是被按下的选中状态
// 设置按钮的选中状态: true-选中, false-没选中

4.void QAbstractButton::setChecked(bool);
// 设置按钮为(选中/未选中)状态
// 设置该属性前, 必须先进行checkable属性的设置!!!
eg:
ui->pushButton->setChecked(true);//设置按钮为选中状态
qDebug()<<ui->pushButton->isChecked();//输出为:true

1.3常用的信号和槽函数

SIGNAL:
//当按钮被激活时(即,当鼠标光标在按钮内时按下然后释放),当键入快捷键时,或者当click()或animateClick()被调用时,这个信号被发出。值得注意的是,如果调用setDown()、setChecked()或toggle(),则不会触发此信号。

[signal] void QAbstractButton::clicked(bool checked = false);
// 在按下按钮的时候发射这个信号
[signal] void QAbstractButton::pressed();
// 在释放这个按钮的时候发射直观信号
[signal] void QAbstractButton::released();
// 每当可检查按钮改变其状态时,就会发出此信号。checked在选中按钮时为true,在未选中按钮时为false。
[signal] void QAbstractButton::toggled(bool checked);

SLOT:
// 执行一个动画点击:按钮被立即按下,并在毫秒后释放(默认是100毫秒)。
[slot] void QAbstractButton::animateClick(int msec = 100);
// 执行一次按钮点击, 相当于使用鼠标点击了按钮
[slot] void QAbstractButton::click();
// 设置按钮被选中
[slot] void QAbstractButton::setChecked(bool);
// 设置按钮上图标大小
[slot]void setIconSize(const QSize &size);
// 切换可检查按钮的状态。 checked <==> unchecked
[slot] void QAbstractButton::toggle();

二、QPushButton

// 构造函数
/*
参数:
    - icon: 按钮上显示的图标
    - text: 按钮上显示的标题
    - parent: 按钮的父对象, 可以不指定
*/
QPushButton::QPushButton(const QIcon &icon, const QString &text, QWidget *parent = nullptr);
QPushButton::QPushButton(const QString &text, QWidget *parent = nullptr);
QPushButton::QPushButton(QWidget *parent = nullptr);

// 判断按钮是不是默认按钮
bool isDefault() const;
// 一般在对话框窗口中使用, 将按钮设置为默认按钮, 自动关联 Enter 键 
void setDefault(bool);

/*
将弹出菜单菜单与此按钮关联起来。这将把按钮变成一个菜单按钮,
在某些样式中会在按钮文本的右边产生一个小三角形。
*/
void QPushButton::setMenu(QMenu *menu);

/*
显示(弹出)相关的弹出菜单。如果没有这样的菜单,这个函数什么也不做。
这个函数直到弹出菜单被用户关闭后才返回。
*/
[slot] void QPushButton::showMenu();

2.1QPushButton的使用方式:

  • [ ]作为普通按钮, 可以显示文本信息和图标;
  • [ ]设置check属性, 使其可以处于持续的被选中状态;
  • [ ]关联一个菜单, 点击按钮菜单弹出。

2.2将按钮与菜单向关联的案例

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QMenu>
#include <QPushButton>
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    QMenu *pMenu = new QMenu(this);
    pMenu->setTitle(QString("菜单名1"));//设置菜单标题
    pMenu->addAction(QString("action1"));//往菜单里添加Action
    pMenu->addAction(QString("action2"));
    pMenu->addSeparator();

    QMenu *pChildMenu = new QMenu(this);
    pChildMenu->setTitle(QString("菜单名2"));//设置菜单标题
    pChildMenu->addAction(QString("action3"));
    pChildMenu->addAction(QString("action4"));
    pMenu->addMenu(pChildMenu);//将菜单pChildMenu作为子菜单添加到pMenu菜单中。

    QAction *action = new QAction(pChildMenu);//构造函数:explicit QAction(QObject *parent = nullptr);
    action->setText(QStringLiteral("action5"));
    action->setIcon(QIcon("C:\\Users\\yh\\Desktop\\pic\\2.jpeg"));//设置图标
    pChildMenu->addAction(action);
    pMenu->addSeparator();

    QMenu *pChildMenu1 = new QMenu(this);
    pChildMenu1->setTitle(QString("菜单名3"));//设置菜单标题
    pChildMenu1->addAction(QString("action6"));
    pChildMenu1->addAction(QString("action7"));
    pMenu->addMenu(pChildMenu1);

    QPushButton *pBtn = new QPushButton(this);
    pBtn->setText(QString("菜单名"));
    pBtn->setGeometry(100,100,80,40);
    pBtn->setMenu(pMenu);
}

三、QToolButton

3.1常用API

/ 构造函数 /
QToolButton::QToolButton(QWidget *parent = nullptr);

/// 公共成员函数 ///
/*
    1. 将给定的菜单与此工具按钮相关联。
    2. 菜单将根据按钮的弹出模式显示。
    3. 菜单的所有权没有转移到“工具”按钮(不能建立父子关系)
*/
void QToolButton::setMenu(QMenu *menu);
// 返回关联的菜单,如果没有定义菜单,则返回nullptr。
QMenu *QToolButton::menu() const;

/*
弹出菜单的弹出模式是一个枚举类型: QToolButton::ToolButtonPopupMode, 取值如下:
    - QToolButton::DelayedPopup: 
        - 延时弹出, 按压工具按钮一段时间后才能弹出, 比如:浏览器的返回按钮
        - 长按按钮菜单弹出, 但是按钮的 clicked 信号不会被发射
    - QToolButton::MenuButtonPopup: 
        - 在这种模式下,工具按钮会显示一个特殊的箭头,表示有菜单。
	- 当按下按钮的箭头部分时,将显示菜单。按下按钮部分发射 clicked 信号
    - QToolButton::InstantPopup: 
        - 当按下工具按钮时,菜单立即显示出来。
        - 在这种模式下,按钮本身的动作不会被触发(不会发射clicked信号
*/
// 设置弹出菜单的弹出方式
void setPopupMode(QToolButton::ToolButtonPopupMode mode);
// 获取弹出菜单的弹出方式
QToolButton::ToolButtonPopupMode popupMode() const;

/*
QToolButton可以帮助我们在按钮上绘制箭头图标, 是一个枚举类型, 取值如下: 
    - Qt::NoArrow: 没有箭头
    - Qt::UpArrow: 箭头向上
    - Qt::DownArrow: 箭头向下
    - Qt::LeftArrow: 箭头向左
    - Qt::RightArrow: 箭头向右
*/
// 显示一个箭头作为QToolButton的图标。默认情况下,这个属性被设置为Qt::NoArrow。
void setArrowType(Qt::ArrowType type);
// 获取工具按钮上显示的箭头图标样式
Qt::ArrowType arrowType() const;

/ 槽函数 /
// 给按钮关联一个QAction对象, 主要目的是美化按钮
[slot] void QToolButton::setDefaultAction(QAction *action);
// 返回给按钮设置的QAction对象
QAction *QToolButton::defaultAction() const;

/*
图标的显示样式是一个枚举类型->Qt::ToolButtonStyle, 取值如下:
    - Qt::ToolButtonIconOnly: 只有图标, 不显示文本信息
    - Qt::ToolButtonTextOnly: 不显示图标, 只显示文本信息
    - Qt::ToolButtonTextBesideIcon: 文本信息在图标的后边显示
    - Qt::ToolButtonTextUnderIcon: 文本信息在图标的下边显示
    - Qt::ToolButtonFollowStyle: 跟随默认样式(只显示图标)
*/
// 设置的这个属性决定工具按钮是只显示一个图标、只显示文本,还是在图标旁边/下面显示文本。
[slot] void QToolButton::setToolButtonStyle(Qt::ToolButtonStyle style);
// 返回工具按钮设置的图标显示模式
Qt::ToolButtonStyle toolButtonStyle() const;

// 显示相关的弹出菜单。如果没有这样的菜单,这个函数将什么也不做。这个函数直到弹出菜单被用户关闭才会返回。
[slot] void QToolButton::showMenu();

3.2ToolButton使用方式

QToolButton有4种使用方式:

  • 作为普通按钮, 可以显示文本信息和图标
  • 按钮的图标可以使用不同的方式设置, 并且制定图标和文本信息的显示模式
  • 设置check属性, 使其可以处于持续的被选中状态
  • 关联一个菜单, 点击按钮菜单弹出, 并且可以设置菜单的弹出方式

3.3ToolButton属性设置

ui->toolButton->setGeometry(QRect(230, 170, 150, 150));
ui->toolButton>setIcon(QIcon("C:\\Users\\yh\\Desktop\\pic\\2.jpeg"));//设置图标
// 调整背景图标大小
ui->toolButton->setIconSize(QSize(100, 100));//设置图标大小
ui->toolButton->setText("小飞机");//设置文字
ui->toolButton->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);//设置按钮风格:文字在图标下方
ui->toolButton->setAutoRaise(true);//设置按钮扁平化,即按钮和界面齐平,不显示按钮的边框

设置按钮风格结果:
在这里插入图片描述
设置按钮扁平化结果:
在这里插入图片描述
菜单弹出方式案例

	QMenu* menu = new QMenu();
    menu->addAction("1");
    menu->addAction("2");
    menu->addAction("3");
    ui->toolButton->setMenu(menu);
    //ui->toolButton->setPopupMode(QToolButton::InstantPopup);//覆盖按钮自身的触发.点击按钮即弹出菜单
    //ui->toolButton->setPopupMode(QToolButton::DelayedPopup); //默认值 延时弹出
    ui->toolButton->setPopupMode(QToolButton::MenuButtonPopup);//点击按钮上的小箭头会立即弹出菜单.但点击区域仅限于小箭头区域

四、RadioButton

4.1RadioButton常见API

QRadioButton是Qt提供的单选按钮, 一般都是以组的方式来使用(多个按钮中同时只能选中其中一个)。

注意:!!!如果单选按钮被选中, 再次点击这个按钮选中状态是不能被取消的。

// 构造函数
/*
参数:
    - text: 按钮上显示的标题
    - parent: 按钮的父对象
*/
QRadioButton::QRadioButton(const QString &text, QWidget *parent = nullptr);
QRadioButton::QRadioButton(QWidget *parent = nullptr);

单选按钮一般是以组的形式来使用的, 在同一窗口中, Qt会认为所有的单选按钮都属于同一组, 如果需要多个单选按钮组, 应该将他们放到不同的子窗口中。
在这里插入图片描述

五、QCheckBox

QCheckBox是Qt中的复选框按钮, 可以单独使用, 也可以以组的方式使用(同一组可以同时选中多个), 当复选按钮被选中, 再次点击之后可以取消选中状态, 这一点和单选按钮是不同的。

5.1常用API

// 构造函数
/*
参数:
    - text: 按钮上显示的文本信息
    - parent: 按钮的父对象
*/
QCheckBox::QCheckBox(const QString &text, QWidget *parent = nullptr);
QCheckBox::QCheckBox(QWidget *parent = nullptr);

// 判断当前复选框是否为三态复选框, 默认情况下为两种状态: 未选中, 选中
bool isTristate() const;
// 设置当前复选框为三态复选框: 未选中, 选中, 半选中
void setTristate(bool y = true);

/*
参数 state, 枚举类型 Qt::CheckState:
    - Qt::Unchecked	      --> 当前复选框没有被选中
    - Qt::PartiallyChecked    --> 当前复选框处于半选中状态, 部分被选中(三态复选框)
    - Qt::Checked	      --> 当前复选框处于选中状态
*/
// 设置复选框按钮的状态
void QCheckBox::setCheckState(Qt::CheckState state);
// 获取当前复选框的状态
Qt::CheckState QCheckBox::checkState() const;

5.2信号

// 当复选框的状态改变时,即当用户选中或取消选中复选框时,他的信号就会发出。
// 参数 state 表示的是复选框的三种状态中某一种, 可参考 Qt::CheckState
[signal] void QCheckBox::stateChanged(int state);

5.3QCheckBox使用案例

//widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QPushButton>
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    // 设置根节点的三态属性
        ui->wives->setTristate(true);
        // 处理根节点的鼠标点击事件
        connect(ui->wives, &QCheckBox::clicked, this, [=](bool bl)
        {
            if(bl)
            {
                // 子节点全部设置为选中状态
                ui->checkBox->setChecked(true);
                ui->checkBox_2->setChecked(true);
                ui->checkBox_3->setChecked(true);
                ui->checkBox_4->setChecked(true);
                ui->checkBox_5->setChecked(true);
            }
            else
            {
                // 子节点全部设置为非选中状态
                ui->checkBox->setChecked(false);
                ui->checkBox_2->setChecked(false);
                ui->checkBox_3->setChecked(false);
                ui->checkBox_4->setChecked(false);
                ui->checkBox_5->setChecked(false);
            }
        });

        // 处理子节点的状态变化, 对应的槽函数相同
        connect(ui->checkBox, &QCheckBox::stateChanged, this, &Widget::statusChanged);
        connect(ui->checkBox_2, &QCheckBox::stateChanged, this, &Widget::statusChanged);
        connect(ui->checkBox_3, &QCheckBox::stateChanged, this, &Widget::statusChanged);
        connect(ui->checkBox_4, &QCheckBox::stateChanged, this, &Widget::statusChanged);
        connect(ui->checkBox_5, &QCheckBox::stateChanged, this, &Widget::statusChanged);

    }

    // 槽函数
    void Widget::statusChanged(int state)
    {
        if(state == Qt::Checked)
        {
            m_number ++;	// 选中一个子节点, 计数器加1
        }
        else
        {
            m_number --;   // 取消选中一个子节点, 计数器减1
        }

        // 根据计数器值判断根节点是否需要做状态的更新
        if(m_number == 5)
        {
            ui->wives->setCheckState(Qt::Checked);
        }
        else if(m_number == 0)
        {
            ui->wives->setCheckState(Qt::Unchecked);
        }
        else
        {
            ui->wives->setCheckState(Qt::PartiallyChecked);
        }

}

Widget::~Widget()
{
    delete ui;
}

//widget.h
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private:
    Ui::Widget *ui;
    int m_number = 0;    // 添加一个计数器, 记录有几个子节点被选中了
private slots:
    // 添加槽函数, 处理复选框按钮状态变化
    void statusChanged(int state);
};

#endif // WIDGET_H

界面布局:
在这里插入图片描述
效果演示:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值