当前位置: 首页 > news >正文

Qt Widgets 之 QAbstractButton

一、概述

QAbstractButton类是Qt框架中所有按钮控件的 抽象基类,提供了按钮的通用功能基本行为
该类作为抽象接口,定义了按钮的标准行为模式,具体的视觉表现和特定行为则由其子类实现。QAbstractButton继承自QWidget,被QPushButton(标准按钮)、QCheckBox(复选框)、QRadioButton(单选按钮)和QToolButton(工具按钮)等具体按钮类继承。

QObject
QWidget
QAbstractButton
QPushButton
QToolButton
QRadioButton
QCheckBox

QAbstractButton类支持两种基本按钮类型:

  • 普通按钮(点击触发操作)
  • 切换按钮(可选择/取消选择的状态切换)。

通过QAbstractButton提供的通用接口,开发者可以统一地处理各种按钮的状态管理、用户交互和视觉表现,从而构建一致的用户交互体验。

二、QAbstractButton属性

QAbstractButton类提供了一系列属性来控制按钮的外观和行为。下表列出了该类的主要属性:

属性名称类型描述访问函数
autoExclusivebool控制是否启用自动排他性。启用后,同属一个父部件的可选中按钮行为类似于互斥按钮组(任何时候只能选中一个)。默认情况下,除单选按钮外,此属性为false。bool autoExclusive() const
void setAutoExclusive(bool)
autoRepeatbool控制是否启用自动重复功能。启用后,用户按住按钮时会定期发出pressed()、released()和clicked()信号。默认false。bool autoRepeat() const
void setAutoRepeat(bool)
autoRepeatDelayint自动重复的初始延迟时间(毫秒)。定义按钮按下到第一次自动重复信号发出前的时间。int autoRepeatDelay() const
void setAutoRepeatDelay(int)
autoRepeatIntervalint自动重复的时间间隔(毫秒)。定义自动重复信号之间的时间间隔。int autoRepeatInterval() const
void setAutoRepeatInterval(int)
checkablebool控制按钮是否可被选中(即可切换状态)。如果为true,按钮可以在选中和未选中状态之间切换。默认false(QRadioButton和QCheckBox除外)。bool isCheckable() const
void setCheckable(bool)
checkedbool表示按钮当前是否被选中。只有可选中(checkable)按钮才能被设置为选中状态。bool isChecked() const
void setChecked(bool)
downbool表示按钮是否被按下。如果为true,按钮显示为按下状态。bool isDown() const
void setDown(bool)
iconQIcon按钮上显示的图标。QIcon icon() const
void setIcon(const QIcon &icon)
iconSizeQSize按钮上显示的图标的大小。QSize iconSize() const
void setIconSize(const QSize &size)
shortcutQKeySequence与按钮关联的快捷键。按下快捷键将触发按钮点击。QKeySequence shortcut() const
void setShortcut(const QKeySequence &key)
textQString按钮上显示的文本。如果文本包含"&“字符,则会自动创建快捷键(如”&OK"对应Alt+O)。QString text() const
void setText(const QString &text)

三、QAbstractButton信号

QAbstractButton提供了四个主要信号,用于响应用户的不同交互操作:

  1. void clicked(bool checked = false)
    当按钮被点击时发出此信号。这是在鼠标按下并释放、快捷键触发或调用click()/animateClick()方法时触发的最常用信号。对于可选中按钮,参数checked表示按钮的新状态(选中为true,未选中为false)。

  2. void pressed()
    当鼠标按下按钮时立即发出此信号。即使用户还没有释放鼠标按钮,也会立即触发。

  3. void released()
    当鼠标释放按钮时发出此信号。即使鼠标不在按钮上方(即按下后移动到按钮外释放),也会触发此信号。

  4. void toggled(bool checked)
    可选中按钮的状态发生变化时发出此信号(从选中到未选中或从未选中到选中)。参数checked表示按钮的新状态。注意:此信号仅在状态改变时发出,而clicked()信号总是在点击时发出(即使状态没有变化)。

四、QAbstractButton常用方法

QAbstractButton提供了多个公共方法用于控制按钮的行为和状态:

  • QAbstractButton(QWidget *parent = nullptr)
    构造函数,创建一个抽象的按钮对象,可指定父组件。

  • void animateClick(int msec = 100)
    执行一个动画点击:按钮立即被按下,并在指定的毫秒数后释放。会发出所有相关的点击信号。

  • void click()
    模拟按钮点击,触发按钮的点击行为并发出相关信号。

  • void setChecked(bool)
    设置按钮的选中状态(仅对可选中按钮有效)。

  • void toggle()
    切换可选中按钮的状态(从选中到未选中或从未选中到选中)。

  • bool isCheckable() const
    返回按钮是否可选中。

  • bool isChecked() const
    返回按钮是否处于选中状态。

  • bool isDown() const
    返回按钮是否处于按下状态。

  • QButtonGroup *group() const
    返回此按钮所属的按钮组(如果有的话)。

五、QAbstractButton 的作用

1.Qt中的具体子类

首先 Qt 中的常用的几个标准按钮继承于按钮基类QAbstractButton,比如QPushButton
RatioButton等,它们都是基于此实现的具体子类。

2. 自定义按钮控件

除此以外,当需要创建自定义风格的按钮时,可以继承 QAbstractButton并且实现自己的绘制逻辑:

class CustomButton : public QAbstractButton {Q_OBJECT
public:CustomButton(QWidget *parent = nullptr) : QAbstractButton(parent) {}protected:void paintEvent(QPaintEvent *) override {QPainter painter(this);// 自定义绘制代码if(isDown()) {// 绘制按下状态} else {// 绘制正常状态}}QSize sizeHint() const override {return QSize(100, 30);}
};

3. 处理多种按钮类型的通用操作

如果需要统一处理不同类型的按钮时,可以使用 QAbstractButton 作为通用接口,这也是继承的特点。

// 连接所有按钮的点击信号到一个槽函数
void setupButtons(QList<QAbstractButton*> buttons) {for (QAbstractButton *button : buttons) {connect(button, &QAbstractButton::clicked, this, &MyClass::onButtonClicked);}
}

持续记录更新中。。。。。。

http://www.xdnf.cn/news/1418347.html

相关文章:

  • 每周读书与学习->认识性能测试工具JMeter
  • Kafka Connect + Streams 用到极致从 CDC 到流处理的一套落地方案
  • UCIE Specification详解(十二)
  • Git中批量恢复文件到之前提交状态
  • 收藏!VSCode 开发者工具快捷键大全
  • 在Linux系统中安装Jenkins(保姆级别)
  • Java:Could not resolve all files for configuration
  • Day42 Grad-CAM与Hook函数
  • UniApp + SignalR + Asp.net Core 做一个聊天IM,含emoji 表情包
  • 【Docker】Docker容器和镜像管理常用命令
  • 【2025ICCV】Vision Transformers 最新研究成果
  • 无题250901
  • GaussDB 集群故障cm_ctl: can‘t connect to cm_server
  • .Net程序员就业现状以及学习路线图(二)
  • oracle默认事务隔离级别
  • Windows神器,按键屏蔽
  • 深入理解 HTTP 与 HTTPS:区别以及 HTTPS 加密原理
  • 【 VPX638】基于KU115 FPGA+C6678 DSP的6U VPX双FMC接口通用信号处理平台
  • 配送算法19 Two Fast Heuristics for Online Order Dispatching
  • Objective-C 的坚毅与传承:在Swift时代下的不可替代性优雅草卓伊凡
  • Java面试宝典:Redis高并发高可用(主从复制、哨兵)
  • 【算法基础】链表
  • PowerPoint和WPS演示如何在放映PPT时用鼠标划重点
  • 趣味学RUST基础篇(String)
  • rust语言 (1.88) egui (0.32.1) 学习笔记(逐行注释)(二十二)控件的可见、可用性
  • 如何从 STiROT 启动 STiROT_Appli_TrustZone LAT1556
  • JS闭包讲解
  • Elasticsearch面试精讲 Day 4:集群发现与节点角色
  • 《JAVA EE企业级应用开发》第一课笔记
  • 记录第一次使用docker打包镜像的操作步骤以及问题解决