本页内容

QAbstractButton Class

QAbstractButton 类是按钮小部件的抽象基类,提供了按钮共有的功能。更多内容...

头文件: #include <QAbstractButton>
CMake: find_package(Qt6 REQUIRED COMPONENTS Widgets)
target_link_libraries(mytarget PRIVATE Qt6::Widgets)
qmake: QT += widgets
继承自: QWidget
继承自:

QCheckBox、QPushButton 、QRadioButton ,以及QToolButton

属性

公共函数

QAbstractButton(QWidget *parent = nullptr)
virtual ~QAbstractButton()
bool autoExclusive() const
bool autoRepeat() const
int autoRepeatDelay() const
int autoRepeatInterval() const
QButtonGroup *group() const
QIcon icon() const
QSize iconSize() const
bool isCheckable() const
bool isChecked() const
bool isDown() const
void setAutoExclusive(bool)
void setAutoRepeat(bool)
void setAutoRepeatDelay(int)
void setAutoRepeatInterval(int)
void setCheckable(bool)
void setDown(bool)
void setIcon(const QIcon &icon)
void setShortcut(const QKeySequence &key)
void setText(const QString &text)
QKeySequence shortcut() const
QString text() const

公共槽位

void animateClick()
void click()
void setChecked(bool)
void setIconSize(const QSize &size)
void toggle()

信号

void clicked(bool checked = false)
void pressed()
void released()
void toggled(bool checked)

受保护函数

virtual void checkStateSet()
virtual bool hitButton(const QPoint &pos) const
virtual void nextCheckState()

重新实现的受保护函数

virtual void changeEvent(QEvent *e) override
virtual bool event(QEvent *e) override
virtual void focusInEvent(QFocusEvent *e) override
virtual void focusOutEvent(QFocusEvent *e) override
virtual void keyPressEvent(QKeyEvent *e) override
virtual void keyReleaseEvent(QKeyEvent *e) override
virtual void mouseMoveEvent(QMouseEvent *e) override
virtual void mousePressEvent(QMouseEvent *e) override
virtual void mouseReleaseEvent(QMouseEvent *e) override
virtual void paintEvent(QPaintEvent *e) override = 0
virtual void timerEvent(QTimerEvent *e) override

详细说明

该类实现了一个抽象按钮。该类的子类负责处理用户操作,并指定按钮的绘制方式。

QAbstractButton 同时支持按压按钮和可选中(切换)按钮。可选中按钮由QRadioButton 和QCheckBox 类实现。按压按钮由QPushButton 和QToolButton 类实现;如果需要,这些类也提供切换行为。

任何按钮均可显示包含文本和图标的标签。setText() 用于设置文本;setIcon() 用于设置图标。如果按钮处于禁用状态,其标签会发生变化,以使按钮呈现“禁用”外观。

如果按钮是文本按钮,且其字符串中包含“&”符号,QAbstractButton 会自动创建一个快捷键。例如:

QPushButton *button = new QPushButton(tr("Ro&ck && Roll"), this);

Alt+C 快捷键被分配给该按钮,即当用户按下Alt+C 时,按钮将调用animateClick()。详情请参阅QShortcut 文档。若要显示实际的“&”符号,请使用 '&&'。

您还可以使用setShortcut() 函数设置自定义快捷键。这主要适用于没有文本的按钮,因为此类按钮无法自动生成快捷键。

button->setIcon(QIcon(":/images/print.png"));
button->setShortcut(tr("Alt+F7"));

Qt 提供的所有按钮(QPushButton 、QToolButton 、QCheckBox 和QRadioButton )均可显示text 和icons 。

可以通过QPushButton::setDefault() 和QPushButton::setAutoDefault() 将某个按钮设为对话框中的默认按钮。

QAbstractButton 提供了按钮常用的大部分状态:

  • isDown() 表示按钮是否被按下。
  • isChecked() 表示按钮是否被选中。只有可选中按钮才能被选中或取消选中(见下文)。
  • isEnabled() 表示用户是否可以按下该按钮。

    注意: 与其他小部件不同, 从 QAbstractButton 派生的按钮在禁用状态下仍会 接收鼠标和上下文菜单事件。

  • setAutoRepeat() 用于设置当用户长按按钮时,按钮是否自动重复。autoRepeatDelay 和autoRepeatInterval 定义了自动重复的实现方式。
  • setCheckable() 设置该按钮是否为切换按钮。

isDown() 与isChecked() 之间的区别如下。 当用户点击一个切换按钮以选中它时,按钮会先进入“按下”状态,然后释放并进入“选中”状态。当用户再次点击它(以取消选中)时,按钮会先进入“按下”状态,然后进入“未选中”状态(此时isChecked() 和isDown() 均为 false)。

QAbstractButton 提供了四个信号:

  1. pressed() 在鼠标光标位于按钮内部时按下鼠标左键时触发。
  2. released() 信号在鼠标左键松开时发出。
  3. clicked() 在按钮被按下后松开、输入快捷键,或调用click() 或animateClick() 时触发。
  4. toggled() 在切换按钮的状态发生变化时发出。

要继承 QAbstractButton,您必须至少重写paintEvent() 方法,以绘制按钮的轮廓及其文本或位图。通常建议也重写sizeHint() 方法,有时还需重写hitButton() 方法(用于判断按键操作是否发生在按钮内部)。 对于具有两个以上状态的按钮(如三态按钮),你还必须重写checkStateSet()和nextCheckState()。

另请参阅 QButtonGroup 。

属性文档

autoExclusive : bool

该属性用于控制是否启用自动互斥功能

如果启用了自动排他性,属于同一父控件的可选中按钮将表现得如同属于同一个排他按钮组一样。在排他按钮组中,任何时候都只能选中一个按钮;选中另一个按钮会自动取消选中先前选中的那个。

该属性对属于按钮组的按钮无效。

默认情况下,autoExclusive 处于关闭状态,单选按钮除外。

访问函数:

bool autoExclusive() const
void setAutoExclusive(bool)

另请参阅 QRadioButton 。

autoRepeat : bool

该属性用于表示是否启用了 autoRepeat

如果启用了自动重复,则当按钮被按下时,pressed()、released() 和clicked() 信号会以固定间隔发出。默认情况下,自动重复处于关闭状态。初始延迟和重复间隔分别由autoRepeatDelay 和autoRepeatInterval 以毫秒为单位定义。

注意:如果按键是通过快捷键按下的,则自动重复功能由系统启用并控制,而非由本类控制。此时,pressed()、released() 和clicked() 信号将与正常情况一样被触发。

访问函数:

bool autoRepeat() const
void setAutoRepeat(bool)

autoRepeatDelay : int

此属性用于设置自动重复的初始延迟

如果启用了autoRepeat ,则autoRepeatDelay定义了自动重复开始前的初始延迟(单位为毫秒)。

相关功能:

int autoRepeatDelay() const
void setAutoRepeatDelay(int)

另请参阅 autoRepeat 和autoRepeatInterval 。

autoRepeatInterval : int

该属性用于设置自动重复的间隔

如果启用了“autoRepeat ”,则“autoRepeatInterval”定义自动重复间隔的长度(单位为毫秒)。

访问函数:

int autoRepeatInterval() const
void setAutoRepeatInterval(int)

另请参阅 autoRepeat 和autoRepeatDelay 。

checkable : bool

该属性用于指定按钮是否可选中

默认情况下,该按钮不可选中。

访问函数:

bool isCheckable() const
void setCheckable(bool)

另请参阅 checked 。

checked : bool

该属性用于确定按钮是否被选中

只有可选中的按钮才能被选中。默认情况下,该按钮处于未选中状态。

访问函数:

bool isChecked() const
void setChecked(bool)

通知器信号:

void toggled(bool checked)

另请参阅 checkable 。

down : bool

该属性表示按钮是否被按下

如果该属性值为true ,则表示按钮被按下。若将该属性设置为true,则不会发出pressed()和clicked()信号。默认值为false。

访问函数:

bool isDown() const
void setDown(bool)

icon : QIcon

该属性用于指定按钮上显示的图标

图标的默认大小由GUI样式定义,但可通过设置iconSize 属性进行调整。

访问函数:

QIcon icon() const
void setIcon(const QIcon &icon)

iconSize : QSize

此属性用于存储该按钮所用的图标大小。

默认大小由 GUI 样式定义。这是图标的最大尺寸。较小的图标不会被放大。

访问函数:

QSize iconSize() const
void setIconSize(const QSize &size)

shortcut : QKeySequence

该属性保存与按钮关联的助记符

访问功能:

QKeySequence shortcut() const
void setShortcut(const QKeySequence &key)

text : QString

该属性存储按钮上显示的文本

如果按钮上没有文本,text() 函数将返回一个空字符串。

如果文本中包含“&”符号,系统会自动为其创建快捷键。“&”后面的字符将用作快捷键。如果文本未定义快捷键,则会覆盖或清除之前的任何快捷键。 详情请参阅QShortcut 文档。若要显示真正的“&”符号,请使用 '&&'。

没有默认文本。

访问函数:

QString text() const
void setText(const QString &text)

成员函数文档

[explicit] QAbstractButton::QAbstractButton(QWidget *parent = nullptr)

创建一个带有parent 的抽象按钮。

[virtual noexcept] QAbstractButton::~QAbstractButton()

销毁该按钮。

[slot] void QAbstractButton::animateClick()

执行一次动画点击:按钮立即被按下,并在100毫秒后松开。

在按钮释放之前再次调用此函数将重置释放计时器。

与点击相关的所有信号都会在适当的时候触发。

如果按钮处于disabled.

另请参阅 click()。

[override virtual protected] void QAbstractButton::changeEvent(QEvent *e)

重写了:QWidget::changeEvent(QEvent *event)。

[virtual protected] void QAbstractButton::checkStateSet()

当调用setChecked()时,会调用此虚拟处理程序,除非该调用是在nextCheckState()内部进行的。它允许子类重置其按钮的中间状态。

另请参阅 nextCheckState()。

[slot] void QAbstractButton::click()

执行一次点击操作。

将根据需要发出与单击相关的所有常规信号。如果该按钮是可选中的,则切换按钮的状态。

如果按钮为disabled.

另请参阅 animateClick()。

[signal] void QAbstractButton::clicked(bool checked = false)

当按钮被激活(即鼠标光标位于按钮内部时按下并松开按钮)、输入快捷键,或者调用click()或animateClick()时,会发出此信号。需要注意的是,如果调用setDown()、setChecked()或toggle(),则不会发出此信号。

如果按钮支持复选,当按钮被选中时,checked 为 true;未被选中时,则为 false。

另请参阅 pressed()、released() 和toggled()。

[override virtual protected] bool QAbstractButton::event(QEvent *e)

重写了:QWidget::event(QEvent *event)。

[override virtual protected] void QAbstractButton::focusInEvent(QFocusEvent *e)

重写了:QWidget::focusInEvent(QFocusEvent *event)。

[override virtual protected] void QAbstractButton::focusOutEvent(QFocusEvent *e)

重写了:QWidget::focusOutEvent(QFocusEvent *event)。

QButtonGroup *QAbstractButton::group() const

返回该按钮所属的组。

如果该按钮不属于任何QButtonGroup ,则此函数返回nullptr 。

另请参阅 QButtonGroup 。

[virtual protected] bool QAbstractButton::hitButton(const QPoint &pos) const

如果 `pos ` 位于可点击按钮矩形内部,则返回 `true `;否则返回 `false`。

默认情况下,可点击区域为整个小部件。子类可以重写此函数,以支持不同形状和大小的可点击区域。

[override virtual protected] void QAbstractButton::keyPressEvent(QKeyEvent *e)

重写了:QWidget::keyPressEvent(QKeyEvent *event)。

[override virtual protected] void QAbstractButton::keyReleaseEvent(QKeyEvent *e)

重写了:QWidget::keyReleaseEvent(QKeyEvent *event)。

[override virtual protected] void QAbstractButton::mouseMoveEvent(QMouseEvent *e)

重写了:QWidget::mouseMoveEvent(QMouseEvent *event)。

[override virtual protected] void QAbstractButton::mousePressEvent(QMouseEvent *e)

重写了:QWidget::mousePressEvent(QMouseEvent *event)。

[override virtual protected] void QAbstractButton::mouseReleaseEvent(QMouseEvent *e)

重写了:QWidget::mouseReleaseEvent(QMouseEvent *event)。

[virtual protected] void QAbstractButton::nextCheckState()

当按钮被点击时,会调用此虚拟处理程序。如果按钮处于isCheckable()状态,则默认实现会调用setChecked(!isChecked())。这允许子类实现按钮的中间状态。

另请参阅 checkStateSet()。

[override pure virtual protected] void QAbstractButton::paintEvent(QPaintEvent *e)

重写了:QWidget::paintEvent(QPaintEvent *event)。

[signal] void QAbstractButton::pressed()

按下按钮时会发出此信号。

另请参阅 released() 和clicked()。

[signal] void QAbstractButton::released()

松开按钮时会发出此信号。

另请参阅 pressed()、clicked()、以及toggled()。

[override virtual protected] void QAbstractButton::timerEvent(QTimerEvent *e)

重写了:QObject::timerEvent(QTimerEvent *event)。

[slot] void QAbstractButton::toggle()

切换可选中按钮的状态。

另请参阅 checked 。

[signal] void QAbstractButton::toggled(bool checked)

每当一个可选中按钮的状态发生变化时,都会触发此信号。如果按钮被选中,checked 为 true;如果按钮未被选中,则为 false。

这可能是用户操作、click() 槽激活,或者因为调用了setChecked() 的结果。

在发出此信号之前,互斥按钮组中按钮的状态会先被更新。这意味着,槽函数可以响应该组中状态发生变化的按钮发出的“off”信号或“on”信号。

例如,可以使用以下模式实现一个槽:该槽对新被选中的按钮发出的信号做出反应,但忽略来自已取消选中按钮的信号:

void MyWidget::reactToToggle(bool checked)
{
   if (checked) {
      // Examine the new button states.
      ...
   }
}

可以使用QButtonGroup 类创建按钮组,并通过QButtonGroup::buttonClicked()信号监听按钮状态的更新。

注意: 属性checked 的Notifier 信号。

另请参阅 checked 和clicked()。

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.