Qt Widgets 之 QAbstractButton
一、概述
QAbstractButton
类是Qt框架中所有按钮控件的 抽象基类,提供了按钮的通用功能和基本行为。
该类作为抽象接口,定义了按钮的标准行为模式,具体的视觉表现和特定行为则由其子类实现。QAbstractButton
继承自QWidget
,被QPushButton
(标准按钮)、QCheckBox
(复选框)、QRadioButton
(单选按钮)和QToolButton
(工具按钮)等具体按钮类继承。
QAbstractButton
类支持两种基本按钮类型:
- 普通按钮(点击触发操作)
- 切换按钮(可选择/取消选择的状态切换)。
通过QAbstractButton
提供的通用接口,开发者可以统一地处理各种按钮的状态管理、用户交互和视觉表现,从而构建一致的用户交互体验。
二、QAbstractButton属性
QAbstractButton
类提供了一系列属性来控制按钮的外观和行为。下表列出了该类的主要属性:
属性名称 | 类型 | 描述 | 访问函数 |
---|---|---|---|
autoExclusive | bool | 控制是否启用自动排他性。启用后,同属一个父部件的可选中按钮行为类似于互斥按钮组(任何时候只能选中一个)。默认情况下,除单选按钮外,此属性为false。 | bool autoExclusive() const void setAutoExclusive(bool) |
autoRepeat | bool | 控制是否启用自动重复功能。启用后,用户按住按钮时会定期发出pressed()、released()和clicked()信号。默认false。 | bool autoRepeat() const void setAutoRepeat(bool) |
autoRepeatDelay | int | 自动重复的初始延迟时间(毫秒)。定义按钮按下到第一次自动重复信号发出前的时间。 | int autoRepeatDelay() const void setAutoRepeatDelay(int) |
autoRepeatInterval | int | 自动重复的时间间隔(毫秒)。定义自动重复信号之间的时间间隔。 | int autoRepeatInterval() const void setAutoRepeatInterval(int) |
checkable | bool | 控制按钮是否可被选中(即可切换状态)。如果为true,按钮可以在选中和未选中状态之间切换。默认false(QRadioButton和QCheckBox除外)。 | bool isCheckable() const void setCheckable(bool) |
checked | bool | 表示按钮当前是否被选中。只有可选中(checkable)按钮才能被设置为选中状态。 | bool isChecked() const void setChecked(bool) |
down | bool | 表示按钮是否被按下。如果为true,按钮显示为按下状态。 | bool isDown() const void setDown(bool) |
icon | QIcon | 按钮上显示的图标。 | QIcon icon() const void setIcon(const QIcon &icon) |
iconSize | QSize | 按钮上显示的图标的大小。 | QSize iconSize() const void setIconSize(const QSize &size) |
shortcut | QKeySequence | 与按钮关联的快捷键。按下快捷键将触发按钮点击。 | QKeySequence shortcut() const void setShortcut(const QKeySequence &key) |
text | QString | 按钮上显示的文本。如果文本包含"&“字符,则会自动创建快捷键(如”&OK"对应Alt+O)。 | QString text() const void setText(const QString &text) |
三、QAbstractButton信号
QAbstractButton
提供了四个主要信号,用于响应用户的不同交互操作:
-
void clicked(bool checked = false)
当按钮被点击时发出此信号。这是在鼠标按下并释放、快捷键触发或调用click()
/animateClick()
方法时触发的最常用信号。对于可选中按钮,参数checked
表示按钮的新状态(选中为true,未选中为false)。 -
void pressed()
当鼠标按下按钮时立即发出此信号。即使用户还没有释放鼠标按钮,也会立即触发。 -
void released()
当鼠标释放按钮时发出此信号。即使鼠标不在按钮上方(即按下后移动到按钮外释放),也会触发此信号。 -
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);}
}
持续记录更新中。。。。。。