聊一聊Qt中的按钮

目录

QAbstractButton

功能概述

快捷键

默认按钮

按钮状态

自动重复功能

切换按钮

信号

子类化

API列表

QPushButton

按钮外观与功能

默认按钮

按钮的状态与模式

使用建议

菜单按钮

API

QToolButton

创建工具按钮

用途示例

自动抬起功能

图标设置

外观与尺寸调整

弹出菜单

API

QRadioButton

自动排他性

状态变化信号

文本和图标设置

QCheckBox

状态变化信号

三态复选框

文本和图标设置

API

样例代码


我们来聊一聊最常见的一个控件:按钮。Qt当中实际上有六种按钮,但是常用的是四个:分别是QPushButton, QToolButton, QRadioButton和QCheckBox。还有余下的QCommandLinkButton:命令链接按钮,和QDialogButtonBox:对话框按钮,笔者使用的并不多。他们的特点是都是来源于QAbstractButton这个基类。为此,我们有有必要从基类出发认识Qt的按钮。

QAbstractButton

在后面我们需要认识到:我们需要从软件工程的设计思路去理解一个框架。基类往往定义了一个族类的基调。所以让我们看看QAbstractButton到底干了什么。该类的子类处理用户操作,并定义按钮的绘制方式。

功能概述

QAbstractButton 支持两种类型的按钮:普通按钮和可勾选(切换)按钮。可勾选按钮由 QRadioButtonQCheckBox 类实现,而普通按钮则由 QPushButtonQToolButton 类实现,后者在需要时也支持切换行为。

任何按钮都可以显示一个包含文本和图标的标签。可以使用 setText() 方法设置文本,使用 setIcon() 方法设置图标。当按钮被禁用时,其标签会更改为一种“禁用”外观。

快捷键

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

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

在这个例子中,Alt+C 快捷键被分配给按钮。当用户按下 Alt+C 时,按钮将调用 animateClick()。要显示实际的字符 &,请使用 &&。此外,您还可以使用 setShortcut() 方法设置自定义快捷键。这对于没有文本的按钮特别有用,因为它们无法自动生成快捷键:

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

Qt 提供的所有按钮(如 QPushButtonQToolButtonQCheckBoxQRadioButton)都可以同时显示文本和图标。

默认按钮

在对话框中,可以通过 QPushButton::setDefault()QPushButton::setAutoDefault() 方法将按钮设置为默认按钮。

按钮状态

QAbstractButton 提供了大多数按钮使用的状态:

  • isDown():指示按钮是否被按下。

  • isChecked():指示按钮是否被选中。仅可勾选按钮可以被选中和取消选中。

  • isEnabled():指示按钮是否可以被用户按下。

需要注意的是,与其他小部件不同,派生自 QAbstractButton 的按钮在禁用时仍会接受鼠标和上下文菜单事件。

自动重复功能

setAutoRepeat() 设置按钮在按下时是否会自动重复。autoRepeatDelayautoRepeatInterval 定义了自动重复的方式。

切换按钮

setCheckable() 设置按钮是否为切换按钮。isDown()isChecked() 的区别在于:当用户单击一个切换按钮以选中它时,按钮会先变为按下状态,然后释放到选中状态。当用户再次单击以取消选中时,按钮首先会变为按下状态,然后变为未选中状态(此时 isChecked()isDown() 都为 false)。

信号

QAbstractButton 提供了四个信号:

  • pressed():当左键在按钮内部被按下时发出。

  • released():当左键被释放时发出。

  • clicked():当按钮被首次按下并释放时、快捷键被输入时,或调用 click()animateClick() 时发出。

  • toggled():当切换按钮的状态发生变化时发出。

子类化

要子类化 QAbstractButton,必须至少重新实现 paintEvent() 方法,以绘制按钮的轮廓及其文本或图标。通常建议同时重写 sizeHint(),有时还要重写 hitButton()(用于确定按钮按下是否在按钮范围内)。对于具有多个状态的按钮(如三态按钮),还需要重新实现 checkStateSet()nextCheckState()

API列表

API用途
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处理定时器事件,通常在子类中重写。

当然,具体想了解那些API,请左转到官方参考网站。

QPushButton

QPushButton(或称命令按钮)可能是任何图形用户界面中最常用的部件。用户点击按钮来命令计算机执行某个操作或回答问题。常见的按钮包括“OK”、“应用”、“取消”、“关闭”、“是”、“否”和“帮助”。

按钮外观与功能

命令按钮通常为矩形,显示描述其动作的文本标签。通过在文本前加上字符 & 可以指定快捷键。例如:

QPushButton *button = new QPushButton("&Download", this);

它就会被分配快捷键为 Alt+D。要显示实际的字符 &,请使用 &&

QPushButton可以显示文本标签,并可选地显示一个小图标。这些可以通过构造函数设置,并可以通过 setText()setIcon() 方法进行更改。如果按钮被禁用,其文本和图标的外观将根据 GUI 样式进行调整,以呈现“禁用”状态。

当通过鼠标、空格键或键盘快捷键激活按钮时,QPushButton会发出 clicked() 信号。可以连接此信号以执行按钮的动作。QPushButton还提供不太常用的信号,例如 pressed()released()

默认按钮

对话框中的命令按钮默认是自动默认按钮,即当它们接收键盘输入焦点时,会自动成为默认QPushButton。默认按钮是在对话框中按下 Enter 或 Return 键时激活的按钮。可以通过 setAutoDefault() 方法更改此设置。请注意,自动默认按钮会保留一些额外空间,以便绘制默认按钮指示器。如果不想在按钮周围保留这些空间,可以调用 setAutoDefault(false)

按钮的状态与模式

按钮部件已经发展出许多变化,尤其是在过去十年中。微软的样式指南现在展示了大约十种不同状态的 Windows QPushButton,并且文本暗示在考虑所有特性组合时,实际上还有数十种状态。

主要的模式或状态包括:

  • 可用或不可用(灰显,禁用)

  • 标准QPushButton、切换QPushButton或菜单按钮

  • 开或关(仅针对切换QPushButton)

  • 默认或普通(对话框中的默认按钮通常可以通过 Enter 或 Return 键“点击”)

  • 自动重复或非自动重复

  • 按下状态或未按下状态

使用建议

通常,在应用程序或对话框窗口中,用户点击按钮以执行某个动作时(例如“应用”、“取消”、“关闭”和“帮助”),应该使用QPushButton。QPushButton应该具有宽大、矩形的形状并带有文本标签。小型、通常是方形的按钮用于改变窗口状态,而不是执行操作(例如 QFileDialog 右上角的按钮),则不是命令按钮,而是工具按钮。Qt 提供了一个特殊的类 QToolButton 用于这些按钮。

如果需要切换行为(参见 setCheckable())或在按下时自动重复激活信号的按钮(如滚动条中的箭头按钮,参见 setAutoRepeat()),则命令按钮可能不是合适的选择。在不确定的情况下,使用工具按钮。

注意:在 macOS 上,当QPushButton的宽度小于 50 像素或高度小于 30 像素时,按钮的角从圆角变为方角。可以使用 setMinimumSize() 函数来防止这种情况。

菜单按钮

命令按钮的一个变体是菜单按钮。这些按钮不仅提供一个命令,而是多个命令,因为当它们被点击时,会弹出一个选项菜单。可以使用 setMenu() 方法将弹出菜单与QPushButton关联。

除了QPushButton,Qt 还有其他按钮类型,如单选按钮(QRadioButton)和复选框(QCheckBox)。在 Qt 中,QAbstractButton 基类提供了大多数模式和其他 API,而 QPushButton 则提供了 GUI 逻辑。有关 API 的更多信息,请参见 QAbstractButton

API

API用途
QPushButton(QWidget *parent = nullptr)构造函数,创建一个按钮对象,可以指定父窗口。
QPushButton(const QString &text, QWidget *parent = nullptr)构造函数,创建一个按钮并设置其文本标签。
QPushButton(const QIcon &icon, const QString &text, QWidget *parent = nullptr)构造函数,创建一个按钮并设置其图标和文本标签。
virtual ~QPushButton()虚析构函数,确保正确清理资源。
bool autoDefault() const返回按钮是否为自动默认按钮。
bool isDefault() const返回按钮是否为默认按钮。
bool isFlat() const返回按钮是否为扁平化样式(无边框)。
QMenu * menu() const返回与按钮关联的菜单(如果有)。
void setAutoDefault(bool)设置按钮是否为自动默认按钮。
void setDefault(bool)设置按钮为默认按钮。
void setFlat(bool)设置按钮为扁平化样式或恢复为正常样式。
void setMenu(QMenu *menu)将菜单与按钮关联。
virtual QSize minimumSizeHint() const override返回按钮的最小尺寸提示。
virtual QSize sizeHint() const override返回按钮的推荐尺寸。
void showMenu()显示与按钮关联的菜单。
virtual void initStyleOption(QStyleOptionButton *option) const初始化样式选项,用于绘制按钮的外观。
virtual bool event(QEvent *e) override处理事件,通常在子类中重写。
virtual void focusInEvent(QFocusEvent *e) override处理获得焦点事件,通常在子类中重写。
virtual void focusOutEvent(QFocusEvent *e) override处理失去焦点事件,通常在子类中重写。
virtual bool hitButton(const QPoint &pos) const override判断指定点是否在按钮上,通常在子类中重写。
virtual void keyPressEvent(QKeyEvent *e) override处理按键按下事件,通常在子类中重写。
virtual void mouseMoveEvent(QMouseEvent *e) override处理鼠标移动事件,通常在子类中重写。
virtual void paintEvent(QPaintEvent *) override处理绘制事件,必须在子类中实现。

QToolButton

工具按钮是一种特殊的按钮,用于快速访问特定命令或选项。与普通命令按钮不同,工具按钮通常不显示文本标签,而是显示图标。

创建工具按钮

工具按钮通常通过在 QToolBar 中使用 addAction() 方法创建新 QAction 实例,或者将现有操作添加到工具栏中。也可以像其他部件一样构造工具按钮,并将它们与其他部件排列在布局中。

用途示例

工具按钮的经典用法之一是选择工具,例如绘图程序中的“笔”工具。这可以通过将 QToolButton 设置为切换按钮(参见 setCheckable())来实现。

自动抬起功能

QToolButton 支持自动抬起功能。在自动抬起模式下,当鼠标指向按钮时,按钮会绘制一个 3D 框。此功能在按钮用作 QToolBar 中时自动开启,可以使用 setAutoRaise() 进行更改。

图标设置

工具按钮的图标使用 QIcon 设置。这使得可以为禁用状态和活动状态指定不同的图标。当按钮的功能不可用时,使用禁用图标;当鼠标指针悬停在按钮上时,显示活动图标。

外观与尺寸调整

按钮的外观和尺寸可以通过 setToolButtonStyle()setIconSize() 调整。当在 QMainWindowQToolBar 中使用时,按钮会自动调整以适应 QMainWindow 的设置(请参见 QMainWindow::setToolButtonStyle()QMainWindow::setIconSize())。此外,工具按钮也可以显示箭头符号,这可以通过 arrowType 指定。

弹出菜单

工具按钮可以提供附加选择,通过弹出菜单实现。可以使用 setMenu() 设置弹出菜单。使用 setPopupMode() 配置工具按钮的不同模式。默认模式是 DelayedPopupMode,这种模式有时用于网页浏览器中的“返回”按钮。按下并保持按钮一段时间后,会弹出一个菜单,显示可以跳转到的页面列表。超时设置依赖于样式,参见 QStyle::SH_ToolButton_PopupDelay

API

API用途
QToolButton(QWidget *parent = nullptr)构造函数,创建一个工具按钮对象,可以指定父窗口。
virtual ~QToolButton()虚析构函数,确保正确清理资源。
Qt::ArrowType arrowType() const返回按钮的箭头类型(如向上、向下等)。
bool autoRaise() const返回按钮是否在悬停时自动抬起。
QAction *defaultAction() const返回按钮的默认操作(如果有)。
QMenu *menu() const返回与按钮关联的菜单(如果有)。
QToolButton::ToolButtonPopupMode popupMode() const返回按钮的弹出模式(如是否在按钮上弹出菜单)。
void setArrowType(Qt::ArrowType type)设置按钮的箭头类型。
void setAutoRaise(bool enable)设置按钮是否在悬停时自动抬起。
void setMenu(QMenu *menu)将菜单与工具按钮关联。
void setPopupMode(QToolButton::ToolButtonPopupMode mode)设置工具按钮的弹出模式。
Qt::ToolButtonStyle toolButtonStyle() const返回工具按钮的样式。
virtual QSize minimumSizeHint() const override返回工具按钮的最小尺寸提示。
virtual QSize sizeHint() const override返回工具按钮的推荐尺寸。
void setDefaultAction(QAction *action)设置按钮的默认操作。
void setToolButtonStyle(Qt::ToolButtonStyle style)设置工具按钮的样式(如图标上是否有文本等)。
void showMenu()显示与按钮关联的菜单。
void triggered(QAction *action)当某个操作被触发时发出信号。
virtual void initStyleOption(QStyleOptionToolButton *option) const初始化样式选项,用于绘制工具按钮的外观。
virtual void actionEvent(QActionEvent *event) override处理操作事件,通常在子类中重写。
virtual void changeEvent(QEvent *e) override处理状态变化事件,通常在子类中重写。
virtual void checkStateSet() override处理状态设置事件,通常在子类中重写。
virtual void enterEvent(QEnterEvent *e) override处理鼠标进入事件,通常在子类中重写。
virtual bool event(QEvent *event) override处理一般事件,通常在子类中重写。
virtual bool hitButton(const QPoint &pos) const override判断指定点是否在按钮上,通常在子类中重写。
virtual void leaveEvent(QEvent *e) override处理鼠标离开事件,通常在子类中重写。
virtual void mousePressEvent(QMouseEvent *e) override处理鼠标按下事件,通常在子类中重写。
virtual void mouseReleaseEvent(QMouseEvent *e) override处理鼠标释放事件,通常在子类中重写。
virtual void nextCheckState() override处理下一状态设置事件,通常在子类中重写。
virtual void paintEvent(QPaintEvent *event) override处理绘制事件,必须在子类中实现。
virtual void timerEvent(QTimerEvent *e) override处理定时器事件,通常在子类中重写。

QRadioButton

QRadioButton 是一种选项按钮,可以处于开启(选中)或关闭(未选中)状态。实际上就是一个PushButton中可以查看当前是否选中的长期维持状态的按钮. 单选按钮通常用于提供“多个选项中选择一个”的选择方式。在一组单选按钮中,任何时候只能选中一个按钮;如果用户选择另一个按钮,之前选中的按钮将自动关闭。

自动排他性

单选按钮默认是自动排他(autoExclusive)的。如果启用自动排他,属于同一父窗口的单选按钮会表现得像是同一个排他按钮组。如果需要在同一父窗口中有多个排他按钮组,可以将它们放入 QButtonGroup 中。

状态变化信号

每当按钮的状态切换时,会发出 toggled() 信号。如果希望在每次按钮状态改变时触发某个操作,可以连接这个信号。使用 isChecked() 方法可以查看特定按钮是否被选中。

文本和图标设置

QPushButton 类似,单选按钮可以显示文本,并可选地显示一个小图标。可以通过 setIcon() 设置图标。文本可以在构造函数中设置,也可以通过 setText() 修改。可以通过在文本中用 ampersand(&) 前缀来指定快捷键,例如:

QRadioButton *button = new QRadioButton("Search from the &cursor", this);

QCheckBox

QCheckBox 是一种选项按钮,可以切换为开启(选中)或关闭(未选中)状态。复选框通常用于表示应用程序中的某些功能,这些功能可以独立启用或禁用。可以实现不同的行为类型。例如,可以使用 QButtonGroup 逻辑上分组复选框,以允许互斥的复选框,但 QButtonGroup 不提供任何视觉表示。

状态变化信号

每当复选框被选中或清除时,会发出 checkStateChanged() 信号。如果希望在每次复选框状态变化时触发某个操作,可以连接此信号。可以使用 isChecked() 查询复选框是否被选中。

三态复选框

除了通常的选中和未选中状态外,QCheckBox 可选地提供第三种状态,以指示“无变化”。这在需要给用户提供既不选中也不取消选中复选框的选项时非常有用。如果需要这种第三状态,可以通过 setTristate() 启用,并使用 checkState() 查询当前的切换状态。

文本和图标设置

QPushButton 类似,复选框可以显示文本,并可选地显示一个小图标。可以通过 setIcon() 设置图标。文本可以在构造函数中设置,也可以通过 setText() 修改。可以通过在文本中用 ampersand(&) 前缀来指定快捷键,例如:

QCheckBox *checkbox = new QCheckBox("C&ase sensitive", this);

API

API用途
QCheckBox(QWidget *parent = nullptr)构造函数,创建一个复选框对象,可以指定父窗口。
QCheckBox(const QString &text, QWidget *parent = nullptr)构造函数,创建一个带文本标签的复选框对象。
virtual ~QCheckBox()虚析构函数,确保正确清理资源。
Qt::CheckState checkState() const返回复选框的当前检查状态(选中、未选中或不确定)。
bool isTristate() const返回复选框是否支持三态(即有不确定状态)。
void setCheckState(Qt::CheckState state)设置复选框的检查状态。
void setTristate(bool y = true)设置复选框是否支持三态功能。
virtual QSize minimumSizeHint() const override返回复选框的最小尺寸提示。
virtual QSize sizeHint() const override返回复选框的推荐尺寸。
void checkStateChanged(Qt::CheckState state) (since 6.7)当检查状态改变时发出信号。
void stateChanged(int state) (until 6.9)当状态改变时发出信号(已被 checkStateChanged 替代)。
virtual void initStyleOption(QStyleOptionButton *option) const初始化样式选项,用于绘制复选框的外观。
virtual void checkStateSet() override处理状态设置事件,通常在子类中重写。
virtual bool event(QEvent *e) override处理一般事件,通常在子类中重写。
virtual bool hitButton(const QPoint &pos) const override判断指定点是否在复选框上,通常在子类中重写。
virtual void mouseMoveEvent(QMouseEvent *e) override处理鼠标移动事件,通常在子类中重写。
virtual void nextCheckState() override处理下一状态设置事件,通常在子类中重写。
virtual void paintEvent(QPaintEvent *) override处理绘制事件,必须在子类中实现。

样例代码

完全的样例代码笔者已经在下面:

MainWindow.cpp

#include "MainWindow.h"
#include <QActionGroup>
#include "ui_MainWindow.h"
void inline setPalette(QLineEdit* edit, QColor color) {
    auto lineEdit_palatte = edit->palette();
    lineEdit_palatte.setColor(QPalette::Text, color);
    edit->setPalette(lineEdit_palatte);
}
​
void MainWindow::init_toolButton() {
    // init alignment one
    QMenu*   alignment_menu = new QMenu(this);
    QAction* left           = new QAction(alignment_menu);
    left->setText("左对齐");
    QAction* middle = new QAction(alignment_menu);
    middle->setText("居中对齐");
    QAction* right = new QAction(alignment_menu);
    right->setText("右对齐");
    QList<QAction*> list{left, middle, right};
    QActionGroup*   alignment_group = new QActionGroup(this);
​
    for (auto& each : list) {
        alignment_group->addAction(each);
        each->setCheckable(true);
    }
    left->setChecked(true);
    alignment_menu->addActions(list);
    connect(alignment_group, &QActionGroup::triggered, this,
            [=](QAction* action) {
                if (action == left) {
                    ui->lineEditsrc->setAlignment(Qt::AlignLeft);
                } else if (action == middle) {
                    ui->lineEditsrc->setAlignment(Qt::AlignCenter);
                } else {
                    ui->lineEditsrc->setAlignment(Qt::AlignRight);
                }
            });
​
    ui->toolButton_setAligned->setMenu(alignment_menu);
​
    QMenu*   font_menu = new QMenu(this);
    QAction* bold      = new QAction("粗体", this);
    connect(bold, &QAction::triggered, this, [=]() {
        auto font = ui->lineEditsrc->font();
        font.setBold(true);
        ui->lineEditsrc->setFont(font);
    });
    QAction* italic = new QAction("斜体", this);
    connect(italic, &QAction::triggered, this, [=]() {
        auto font = ui->lineEditsrc->font();
        font.setItalic(true);
        ui->lineEditsrc->setFont(font);
    });
    QAction* underline = new QAction("下划线", this);
    connect(underline, &QAction::triggered, this, [=]() {
        auto font = ui->lineEditsrc->font();
        font.setUnderline(true);
        ui->lineEditsrc->setFont(font);
    });
    list.clear();
    list << bold << italic << underline;
    QActionGroup* font_group = new QActionGroup(this);
    for (auto& each : list) {
        each->setCheckable(true);
        font_group->addAction(each);
    }
    font_menu->addActions(list);
    ui->toolButton_font->setMenu(font_menu);
}
​
MainWindow::MainWindow(QWidget* parent)
    : QMainWindow(parent), ui(new Ui::MainWindow) {
    ui->setupUi(this);
    init_toolButton();
}
​
MainWindow::~MainWindow() {
    delete ui;
}
​
void MainWindow::on_rdbtn_readonly_clicked(bool checked) {
    ui->lineEditsrc->setReadOnly(checked);
}
​
void MainWindow::on_rdbutton_edit_clicked(bool checked) {
    ui->lineEditsrc->setEnabled(checked);
}
​
void MainWindow::on_rdbtn_clearEnable_clicked(bool checked) {
    ui->lineEditsrc->setClearButtonEnabled(checked);
}
​
void MainWindow::on_btn_red_clicked() {
    ::setPalette(ui->lineEditsrc, Qt::red);
}
​
void MainWindow::on_btn_blue_clicked() {
    ::setPalette(ui->lineEditsrc, Qt::blue);
}
​
void MainWindow::on_btn_black_clicked() {
    ::setPalette(ui->lineEditsrc, Qt::black);
}
​

MainWindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
​
#include <QMainWindow>
​
QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE
​
class MainWindow : public QMainWindow {
    Q_OBJECT
​
public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
​
private slots:
​
    void on_rdbtn_readonly_clicked(bool checked);
​
    void on_rdbutton_edit_clicked(bool checked);
​
    void on_rdbtn_clearEnable_clicked(bool checked);
​
    void on_btn_red_clicked();
​
    void on_btn_blue_clicked();
​
    void on_btn_black_clicked();
​
private:
    void            init_toolButton();
    Ui::MainWindow *ui;
};
#endif  // MAINWINDOW_H
​

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/905475.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用RabbitMQ实现微服务间的异步消息传递

使用RabbitMQ实现微服务间的异步消息传递 RabbitMQ简介 安装RabbitMQ 在Ubuntu上安装RabbitMQ 在CentOS上安装RabbitMQ 配置RabbitMQ 创建微服务 生产者服务 安装依赖 生产者代码 消费者服务 消费者代码 运行微服务 消息模式 直接模式 生产者代码 消费者代码 扇出模式 生产…

「实战应用」如何在 DHTMLX Scheduler 中实现动态主题切换?

创建响应式、直观的 UI 需要适应用户对应用程序各个方面的偏好。其中一项可显著提升用户体验的热门功能是能够在明暗主题之间切换。它在日程安排日历等综合组件中尤其有用。 本文将指导您在 DHTMLX Scheduler 中实现动态主题切换&#xff0c;使其适应用户设置的首选系统主题。…

Marin说PCB之电源的Surface Current Density知多少?

小编我是一位资深的国漫迷&#xff0c;像什么仙逆&#xff0c;斗破&#xff0c;斗罗&#xff0c;完美世界&#xff0c;遮天&#xff0c;凡人修仙传&#xff0c;少年歌行等&#xff0c;为了可以看这些视频小编我不惜花费了攒了很多年的私房钱去开了这个三个平台的会员啊&#xf…

【YApi】接口管理平台

一、简介 YApi 是一个用于前后端开发团队协作的 API 管理平台&#xff0c;帮助团队更加高效地进行 API 接口的设计、测试、文档管理和版本控制等工作。 YApi 主要功能&#xff1a; API 设计和管理&#xff1a;提供 API 设计和文档生成工具&#xff0c;使开发者能够轻松创建、…

【C/C++】字符/字符串函数(1)——由string.h提供

零.导言 什么是字符/字符串函数呢&#xff1f; 其实就是一类用于处理字符和字符串的函数。 而其中一部分函数包含在头文件 string.h 中&#xff0c;有 strlen strcpy strcat strcmp strncpy strncat strncmp strstr strtok strerror 等等 接下来我将逐个讲解这些函数。 一.str…

简单的kafkaredis学习之redis

简单的kafka&redis学习之redis 2. Redis 2.1 什么是Redis Redis是一种面向 “Key-Value” 数据类型的内存数据库&#xff0c;可以满足我们对海量数据的快速读写需求&#xff0c;Redis是一个 NoSQL 数据库&#xff0c;NoSQL的全称是not only sql&#xff0c;不仅仅是SQL&…

在 Visual Studio 中使用 Eigen 库

在 Visual Studio 中使用 Eigen 库 参考教程&#xff1a; 在 Visual Studio 中配置 Eigen库_vs调用eigen-CSDN博客 Eigen 是一个开源的 C 库&#xff0c;主要用来支持线性代数&#xff0c;矩阵和矢量运算&#xff0c;数值分析及其相关的算法。Eigen 除了需要 C 标准库以外&am…

认证鉴权框架之—sa-token

一、概述 Satoken 是一个 Java 实现的权限认证框架&#xff0c;它主要用于 Web 应用程序的权限控制。Satoken 提供了丰富的功能来简化权限管理的过程&#xff0c;使得开发者可以更加专注于业务逻辑的开发。 二、逻辑流程 1、登录认证 &#xff08;1&#xff09;、创建token …

MES(Manufacturing Execution System)制造执行系统解决方案 :高效协同, 实现数字化智能工厂

文章目录 引言I 常用功能模块车间实时数据设备维修证书管理II UI设计III 术语5M1Esee also引言 MES软件即制造企业生产过程执行管理软件,是一套面向制造企业车间执行层的生产信息化管理系统。 MES 可以为企业提供包括制造数据管理、计划排程管理、生产调度管理、库存管理、质…

Qt 实战(10)模型视图 | 10.5、代理

文章目录 一、代理1、简介2、自定义代理 前言&#xff1a; 在Qt的模型/视图&#xff08;Model/View&#xff09;框架中&#xff0c;代理&#xff08;Delegate&#xff09;是一个非常重要的概念。它充当了模型和视图之间的桥梁&#xff0c;负责数据的显示和编辑。代理可以自定义…

“北斗+实景三维”,助力全域社会治理

在国家治理体系和治理能力现代化的大背景下&#xff0c;全域社会治理成为提升国家治理效能的关键。“北斗实景三维”技术组合&#xff0c;为全域社会治理提供了新的技术支撑和解决方案。本文将探讨这一技术如何助力全域社会治理&#xff0c;以及其在实际应用中的潜力和挑战。 …

mysql8.0.32升级到8.0.40

上篇8.0.32库的准备&#xff1a;mysql: error while loading shared libraries: libncurses.so.5: cannot open shared object file: No suc-CSDN博客 此篇测试升级到8.0.40 MySQL :: Download MySQL Community Server rootjyc:~# mysql -u root -pabcd1234 mysql: [Warning]…

高阶数据结构--图(graph)

图&#xff08;graph&#xff09; 1.并查集1. 并查集原理2. 并查集实现3. 并查集应用 2.图的基本概念3. 图的存储结构3.1 邻接矩阵3.2 邻接矩阵的代码实现3.3 邻接表3.4 邻接表的代码实现 4. 图的遍历4.1 图的广度优先遍历4.2 广度优先遍历的代码 1.并查集 1. 并查集原理 在一…

go 聊天系统项目-1

1、登录界面 说明&#xff1a;这一节的内容采用 go mod 管理【GO111MODULE‘’】的模块&#xff0c;从第二节开始使用【GO111MODULE‘off’】GOPATH 管理模块。具体参见 go 包相关知识 1.1登录界面代码目录结构 代码所在目录/Users/zld/Go-project/day8/chatroom/ 1.2登录…

支持向量机背后的数学奥秘

一、基本概念与原理 1.1 支持向量机的定义 支持向量机是一种二分类模型&#xff0c;其核心思想是在样本空间中寻找一个超平面&#xff0c;将不同类别的样本分开。这个超平面被称为决策边界或分隔超平面。支持向量是距离决策边界最近的点&#xff0c;这些点决定了决策边界的位…

C语言指针和数组相关习题

目录 sizeof和一维int数组sizeof和一维char数组strlen()和一维char数组sizeof和字符串strlen()和字符串指针变量指向字符串字面常量易错点sizeof(a):sizeof是操作符 当心整型提升sizeof和二维数组复习一下相关知识点练习题 一个离谱的错误指针1指针2指针3指针4指针5指针6指针7指…

Centos安装ZooKeeper教程(单机版)

本章教程介绍,如何在Centos7中,安装ZooKeeper 3.9.3版本。 一、什么是ZooKeeper ? Apache ZooKeeper 是一个分布式协调服务,用于大型分布式系统中的管理和协调。它为分布式应用提供了一个高性能的通信框架,简化了开发人员在构建复杂分布式系统的任务。ZooKeeper 能够解决一…

出国工作——常用英语——网站注册

Please set your password for your new Qt Account. Password must be at least 8 characters in length. 请为您的新 Qt 账户设置密码。密码长度必须至少为 8 个字符。 Password Password strength: BadThis is similar to a commonly used password. TIP: Add another wor…

江协科技STM32学习- P25 UART串口协议

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…

Servlet 3.0 新特性全解

文章目录 Servlet3.0新特性全解Servlet 3.0 新增特性Servlet3.0的注解Servlet3.0的Web模块支持servlet3.0提供的异步处理提供异步原因实现异步原理配置servlet类成为异步的servlet类具体实现异步监听器改进的ServletAPI(上传文件) Servlet3.0新特性全解 tomcat 7以上的版本都支…