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

Qt开发:按钮类的介绍和使用

文章目录

    • 一、命令按钮类 (QPushButton)
      • 1.1 基本功能介绍
      • 1.2 常用构造函数
      • 1.3 常用方法
      • 1.4 信号与槽使用示例
      • 1.5 开关按钮(Checkable)
      • 1.6 创建出菜单按钮(Menu Button)
    • 二、工具按钮类 (QToolButton)
      • 2.1 基本介绍
      • 2.2 特点与优势
      • 2.3 常用方法和属性
      • 2.4 常见图文排列方式(ToolButtonStyle)
      • 2.5 完整示例
      • 2.6 弹出菜单模式(PopupMode)
      • 2.7 Tool Button与工具栏(QToolBar)结合使用
    • 三、单选按钮类 (QRadioButton)
      • 3.1 基本介绍
      • 3.2 基本用法
      • 3.3 完整示例(推荐写法)
      • 3.4 互斥实现方式
      • 3.5 常用函数和属性
      • 3.6 QButtonGroup 管理多个单选按钮
    • 四、复选框按钮类(QCheckBox)
      • 4.1 基本介绍
      • 4.2 常用功能
      • 4.3 基本用法示例
      • 4.4 完整示例
      • 4.5 三态复选框(Tristate)
      • 4.6 QButtonGroup 处理复选框(QCheckBox)
    • 五、命令链接按钮类(QCommandLinkButton)
      • 5.1 基本介绍
      • 5.2 主要接口
      • 5.3 基本示例
    • 六、按钮盒(QDialogButtonBox)
      • 6.1 基本介绍
      • 6.2 常用标准按钮枚举
      • 6.3 基础示例(标准按钮 + 自动信号)
      • 6.4 自定义按钮示例

一、命令按钮类 (QPushButton)

1.1 基本功能介绍

  • 类名:QPushButton
  • 作用:显示一个按钮,用户点击后可以触发槽函数
  • 所属模块:#include <QPushButton>

1.2 常用构造函数

QPushButton(const QIcon &icon, const QString &text, QWidget *parent = nullptr)
QPushButton(const QString &text, QWidget *parent = nullptr)
QPushButton(QWidget *parent = nullptr)

1.3 常用方法

在这里插入图片描述

1.4 信号与槽使用示例

#include <QApplication>
#include <QPushButton>
#include <QMessageBox>int main(int argc, char *argv[])
{QApplication app(argc, argv);QPushButton *btn = new QPushButton("点击我");btn->resize(100, 40);// 连接信号和槽QObject::connect(btn, &QPushButton::clicked, []() {QMessageBox::information(nullptr, "提示", "按钮被点击了!");});btn->show();return app.exec();
}

1.5 开关按钮(Checkable)

QPushButton *btn = new QPushButton("开关按钮");
btn->setCheckable(true); // 必须设置为true
QObject::connect(btn, &QPushButton::toggled, [](bool checked){qDebug() << "当前状态:" << (checked ? "选中" : "未选中");
});

1.6 创建出菜单按钮(Menu Button)

#include <QApplication>
#include <QPushButton>
#include <QMenu>
#include <QMessageBox>int main(int argc, char *argv[])
{QApplication app(argc, argv);QWidget window;QPushButton *menuButton = new QPushButton("更多操作", &window);QMenu *menu = new QMenu(menuButton);QAction *openAction = menu->addAction("打开");QAction *saveAction = menu->addAction("保存");QAction *exitAction = menu->addAction("退出");menuButton->setMenu(menu);menuButton->resize(100, 30);menuButton->move(50, 50);window.resize(200, 150);QObject::connect(openAction, &QAction::triggered, [](){QMessageBox::information(nullptr, "菜单", "点击了打开");});QObject::connect(saveAction, &QAction::triggered, [](){QMessageBox::information(nullptr, "菜单", "点击了保存");});QObject::connect(exitAction, &QAction::triggered, [](){QMessageBox::information(nullptr, "菜单", "点击了退出");});window.setWindowTitle("菜单按钮示例");window.show();return app.exec();
}

输出结果:
在这里插入图片描述
样式和行为提示:

  • 按钮右侧默认会显示一个小箭头(▼),表示它附带菜单。
  • 若你不希望按钮本身响应点击,只弹出菜单,可以使用 QToolButton 替代。
  • 菜单项也可以添加图标、快捷键等。

二、工具按钮类 (QToolButton)

2.1 基本介绍

  • 类名:QToolButton
  • 所属模块:#include <QToolButton>
  • 用途:显示一个带图标、文字或菜单的紧凑型按钮,常用于工具栏(QToolBar)、控制面板等。

2.2 特点与优势

在这里插入图片描述

2.3 常用方法和属性

在这里插入图片描述

2.4 常见图文排列方式(ToolButtonStyle)

button->setToolButtonStyle(Qt::ToolButtonIconOnly);       // 仅图标(默认)
button->setToolButtonStyle(Qt::ToolButtonTextOnly);       // 仅文字
button->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); // 图标左,文字右
button->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);  // 图标上,文字下

2.5 完整示例

#include <QApplication>
#include <QToolButton>
#include <QMenu>
#include <QAction>
#include <QMessageBox>
#include <QWidget>int main(int argc, char *argv[])
{QApplication app(argc, argv);QWidget window;// 创建 QToolButtonQToolButton *toolBtn = new QToolButton(&window);toolBtn->setText("操作");toolBtn->setIcon(QIcon(":/icons/settings.png")); // 可替换为你的图标路径toolBtn->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); // 图标在左,文字在右// 创建菜单QMenu *menu = new QMenu(toolBtn);QAction *action1 = menu->addAction("打开");QAction *action2 = menu->addAction("保存");QAction *action3 = menu->addAction("退出");// 设置菜单toolBtn->setMenu(menu);toolBtn->setPopupMode(QToolButton::MenuButtonPopup); // 点击右侧小箭头弹出菜单// 可选:其他模式// toolBtn->setPopupMode(QToolButton::InstantPopup); // 点击整个按钮即弹出菜单// toolBtn->setPopupMode(QToolButton::DelayedPopup); // 按下后稍等弹出菜单// 布局toolBtn->resize(120, 40);toolBtn->move(40, 40);window.resize(200, 150);window.setWindowTitle("QToolButton + QMenu 示例");// 菜单响应QObject::connect(action1, &QAction::triggered, [](){QMessageBox::information(nullptr, "菜单", "点击了 打开");});QObject::connect(action2, &QAction::triggered, [](){QMessageBox::information(nullptr, "菜单", "点击了 保存");});QObject::connect(action3, &QAction::triggered, [](){QMessageBox::information(nullptr, "菜单", "点击了 退出");});window.show();return app.exec();
}

输出结果:
在这里插入图片描述

2.6 弹出菜单模式(PopupMode)

在这里插入图片描述

2.7 Tool Button与工具栏(QToolBar)结合使用

当需要构建一个标准化工具栏界面(如 Word、Photoshop 中的按钮行),QToolButton 与 QToolBar 的结合是 Qt 中的推荐方案。

QToolBar 简介:

  • QToolBar 是 Qt 提供的可停靠工具栏控件,常用于 QMainWindow 顶部。
  • 可以添加 QToolButton、QAction、QWidget 等。
  • 默认包含在 QMainWindow 中,而不是普通 QWidget 中使用。

组合方式:

  • 方法 1:使用 QMainWindow::addToolBar() + QAction(推荐)
  • 方法 2:直接向 QToolBar 添加 QToolButton

推荐实现(使用 QAction):

#include <QApplication>
#include <QMainWindow>
#include <QToolBar>
#include <QAction>
#include <QMessageBox>int main(int argc, char *argv[])
{QApplication app(argc, argv);QMainWindow window;// 创建工具栏QToolBar *toolBar = new QToolBar("主工具栏", &window);window.addToolBar(Qt::TopToolBarArea, toolBar); // 添加到顶部// 添加操作按钮(使用 QAction)QAction *openAction = new QAction(QIcon(":/icons/open.png"), "打开", &window);QAction *saveAction = new QAction(QIcon(":/icons/save.png"), "保存", &window);QAction *exitAction = new QAction(QIcon(":/icons/exit.png"), "退出", &window);toolBar->addAction(openAction);toolBar->addAction(saveAction);toolBar->addSeparator();  // 添加分隔符toolBar->addAction(exitAction);// 响应槽函数QObject::connect(openAction, &QAction::triggered, [](){QMessageBox::information(nullptr, "操作", "点击了 打开");});QObject::connect(saveAction, &QAction::triggered, [](){QMessageBox::information(nullptr, "操作", "点击了 保存");});QObject::connect(exitAction, &QAction::triggered, [&window](){window.close();});window.resize(400, 300);window.setWindowTitle("QToolBar 示例");window.show();return app.exec();
}

自定义 ToolButton:
如果需要更复杂的菜单按钮样式,也可以手动创建 QToolButton 添加到工具栏

QToolButton *btn = new QToolButton;
btn->setText("更多");
btn->setIcon(QIcon(":/icons/more.png"));
btn->setPopupMode(QToolButton::MenuButtonPopup);
btn->setMenu(new QMenu("菜单"));toolBar->addWidget(btn);  // 工具栏添加自定义按钮

三、单选按钮类 (QRadioButton)

3.1 基本介绍

  • 类名:QRadioButton
  • 头文件:#include <QRadioButton>
  • 所属模块:QtWidgets
  • 用途:提供一组选项中互斥选择的按钮控件

3.2 基本用法

QRadioButton *maleBtn = new QRadioButton("男", this);
QRadioButton *femaleBtn = new QRadioButton("女", this);

多个 QRadioButton 放在一起,默认并不会自动互斥,你需要将它们放入同一个父容器或用 QButtonGroup 管理。

3.3 完整示例(推荐写法)

#include <QApplication>
#include <QRadioButton>
#include <QVBoxLayout>
#include <QGroupBox>
#include <QWidget>
#include <QMessageBox>int main(int argc, char *argv[])
{QApplication app(argc, argv);QWidget window;// 创建单选按钮QRadioButton *maleBtn = new QRadioButton("男");QRadioButton *femaleBtn = new QRadioButton("女");maleBtn->setChecked(true); // 默认选择“男”// 布局QVBoxLayout *layout = new QVBoxLayout;layout->addWidget(maleBtn);layout->addWidget(femaleBtn);QGroupBox *groupBox = new QGroupBox("性别选择");groupBox->setLayout(layout);QVBoxLayout *mainLayout = new QVBoxLayout(&window);mainLayout->addWidget(groupBox);// 信号连接QObject::connect(maleBtn, &QRadioButton::toggled, [](bool checked){if (checked) {QMessageBox::information(nullptr, "选择结果", "你选择了:男");}});window.setLayout(mainLayout);window.setWindowTitle("QRadioButton 示例");window.show();return app.exec();
}

输出结果:
在这里插入图片描述

3.4 互斥实现方式

在这里插入图片描述

3.5 常用函数和属性

在这里插入图片描述

3.6 QButtonGroup 管理多个单选按钮

基本思路:

  • 创建多个 QRadioButton;
  • 用 QButtonGroup 添加这些按钮;
  • 使用 buttonClicked() 信号或 checkedId() 获取当前选中项。

完整示例代码(推荐用法):

#include <QApplication>
#include <QRadioButton>
#include <QButtonGroup>
#include <QVBoxLayout>
#include <QWidget>
#include <QGroupBox>
#include <QMessageBox>int main(int argc, char *argv[])
{QApplication app(argc, argv);QWidget window;// 创建按钮QRadioButton *btnA = new QRadioButton("选项 A");QRadioButton *btnB = new QRadioButton("选项 B");QRadioButton *btnC = new QRadioButton("选项 C");// 创建按钮组QButtonGroup *btnGroup = new QButtonGroup(&window);btnGroup->addButton(btnA, 0);  // 绑定 id=0btnGroup->addButton(btnB, 1);  // 绑定 id=1btnGroup->addButton(btnC, 2);  // 绑定 id=2btnA->setChecked(true);  // 默认选中 A// 布局QVBoxLayout *vLayout = new QVBoxLayout;vLayout->addWidget(btnA);vLayout->addWidget(btnB);vLayout->addWidget(btnC);QGroupBox *groupBox = new QGroupBox("请选择一个选项");groupBox->setLayout(vLayout);QVBoxLayout *mainLayout = new QVBoxLayout(&window);mainLayout->addWidget(groupBox);window.setLayout(mainLayout);// 信号响应:任一按钮被点击QObject::connect(btnGroup, QOverload<int>::of(&QButtonGroup::buttonClicked), [&](int id){QString text = btnGroup->button(id)->text();QMessageBox::information(&window, "你选择了", QString("ID: %1\n选项: %2").arg(id).arg(text));});window.setWindowTitle("QButtonGroup 示例");window.resize(250, 150);window.show();return app.exec();
}

输出结果:
在这里插入图片描述
说明:
在这里插入图片描述
进阶:获取当前选中的按钮内容

int checkedId = btnGroup->checkedId();
QString currentText = btnGroup->button(checkedId)->text();

四、复选框按钮类(QCheckBox)

4.1 基本介绍

  • 类名:QCheckBox
  • 头文件:#include <QCheckBox>
  • 所属模块:QtWidgets
  • 功能:表示开关状态的按钮,用户可选择一个或多个选项

4.2 常用功能

在这里插入图片描述

4.3 基本用法示例

QCheckBox *checkBox = new QCheckBox("我已阅读并同意协议");
checkBox->setChecked(false);  // 初始为未选中connect(checkBox, &QCheckBox::toggled, [](bool checked){if (checked) {qDebug() << "已选中";} else {qDebug() << "未选中";}
});

4.4 完整示例

#include <QApplication>
#include <QCheckBox>
#include <QVBoxLayout>
#include <QMessageBox>
#include <QWidget>int main(int argc, char *argv[])
{QApplication app(argc, argv);QWidget window;QCheckBox *cb1 = new QCheckBox("启用通知");QCheckBox *cb2 = new QCheckBox("启用声音");cb1->setChecked(true);QVBoxLayout *layout = new QVBoxLayout;layout->addWidget(cb1);layout->addWidget(cb2);QObject::connect(cb1, &QCheckBox::stateChanged, [&](int state){QString text = (state == Qt::Checked) ? "启用通知" : "关闭通知";QMessageBox::information(&window, "提示", text);});window.setLayout(layout);window.setWindowTitle("QCheckBox 示例");window.show();return app.exec();
}

4.5 三态复选框(Tristate)

启用三种状态:未选中、中间状态、已选中。

QCheckBox *cb = new QCheckBox("启用所有功能");
cb->setTristate(true);
cb->setCheckState(Qt::PartiallyChecked);

在这里插入图片描述

4.6 QButtonGroup 处理复选框(QCheckBox)

背景说明:

  • QCheckBox 默认是多选按钮,不互斥;
  • QButtonGroup 默认用于互斥逻辑,但可以设为非互斥,从而管理多个复选框;
  • 它的优势在于:统一管理、统一响应信号、统一编号(id)访问。

关键设置:

btnGroup->setExclusive(false);  // 禁用互斥,支持多选

完整示例代码(QButtonGroup + QCheckBox):

#include <QApplication>
#include <QCheckBox>
#include <QButtonGroup>
#include <QVBoxLayout>
#include <QGroupBox>
#include <QWidget>
#include <QMessageBox>int main(int argc, char *argv[])
{QApplication app(argc, argv);QWidget window;// 创建复选框QCheckBox *cbA = new QCheckBox("功能 A");QCheckBox *cbB = new QCheckBox("功能 B");QCheckBox *cbC = new QCheckBox("功能 C");// 创建按钮组QButtonGroup *group = new QButtonGroup(&window);group->addButton(cbA, 0);group->addButton(cbB, 1);group->addButton(cbC, 2);group->setExclusive(false);  // 允许多选(非互斥)// 布局QVBoxLayout *vLayout = new QVBoxLayout;vLayout->addWidget(cbA);vLayout->addWidget(cbB);vLayout->addWidget(cbC);QGroupBox *groupBox = new QGroupBox("选择功能");groupBox->setLayout(vLayout);QVBoxLayout *mainLayout = new QVBoxLayout(&window);mainLayout->addWidget(groupBox);window.setLayout(mainLayout);// 响应某个复选框点击QObject::connect(group, QOverload<int>::of(&QButtonGroup::buttonClicked), [&](int id){QString state = group->button(id)->isChecked() ? "选中" : "取消";QString text = group->button(id)->text();QMessageBox::information(&window, "选项变更", QString("%1 被 %2").arg(text).arg(state));});window.setWindowTitle("QCheckBox + QButtonGroup 示例");window.resize(250, 150);window.show();return app.exec();
}

输出结果:
在这里插入图片描述
如何统一读取多个复选框状态?:

QStringList checkedList;
for (auto *button : group->buttons()) {if (button->isChecked()) {checkedList << button->text();}
}
QString result = "已选择:" + checkedList.join(", ");

QSignalMapper处理多个复选框:

QSignalMapper 简介

  • QSignalMapper 用于将多个控件的信号映射到同一个槽函数;
  • 通过 setMapping() 为每个信号源绑定一个值(如 id、字符串等);
  • 最终统一连接 mapper->mapped(type) 信号到槽中处理。

完整示例代码(QSignalMapper 管理复选框):

#include <QApplication>
#include <QCheckBox>
#include <QVBoxLayout>
#include <QSignalMapper>
#include <QMessageBox>
#include <QWidget>int main(int argc, char *argv[])
{QApplication app(argc, argv);QWidget window;// 创建复选框QCheckBox *cbA = new QCheckBox("选项 A");QCheckBox *cbB = new QCheckBox("选项 B");QCheckBox *cbC = new QCheckBox("选项 C");// 创建 SignalMapperQSignalMapper *mapper = new QSignalMapper(&window);// 将每个复选框点击信号映射为字符串参数QObject::connect(cbA, &QCheckBox::clicked, mapper, static_cast<void (QSignalMapper::*)()>(&QSignalMapper::map));QObject::connect(cbB, &QCheckBox::clicked, mapper, static_cast<void (QSignalMapper::*)()>(&QSignalMapper::map));QObject::connect(cbC, &QCheckBox::clicked, mapper, static_cast<void (QSignalMapper::*)()>(&QSignalMapper::map));// 映射值(可以是 int / QString / QObject*)mapper->setMapping(cbA, "选项 A");mapper->setMapping(cbB, "选项 B");mapper->setMapping(cbC, "选项 C");// 响应:统一处理点击QObject::connect(mapper, static_cast<void (QSignalMapper::*)(const QString &)>(&QSignalMapper::mapped),[&](const QString &text){QMessageBox::information(&window, "点击事件", QString("你点击了:%1").arg(text));});// 布局QVBoxLayout *layout = new QVBoxLayout;layout->addWidget(cbA);layout->addWidget(cbB);layout->addWidget(cbC);window.setLayout(layout);window.setWindowTitle("QSignalMapper 示例");window.resize(250, 150);window.show();return app.exec();
}

QSignalMapper 支持的映射类型:
在这里插入图片描述

五、命令链接按钮类(QCommandLinkButton)

5.1 基本介绍

  • 类名 QCommandLinkButton
  • 头文件 #include <QCommandLinkButton>
  • 模块:QtWidgets
  • 继承关系:继承自 QPushButton
  • 样式特征:显示主标题 + 次级描述(灰色小字),风格类似 Windows 设置向导中的操作项

5.2 主要接口

在这里插入图片描述

5.3 基本示例

#include <QApplication>
#include <QCommandLinkButton>
#include <QVBoxLayout>
#include <QMessageBox>
#include <QWidget>int main(int argc, char *argv[])
{QApplication app(argc, argv);QWidget window;QCommandLinkButton *btn1 = new QCommandLinkButton("立即安装", "安装推荐组件,提升体验");QCommandLinkButton *btn2 = new QCommandLinkButton("自定义安装", "选择安装位置和组件");QObject::connect(btn1, &QCommandLinkButton::clicked, [&](){QMessageBox::information(&window, "安装类型", "你选择了立即安装");});QObject::connect(btn2, &QCommandLinkButton::clicked, [&](){QMessageBox::information(&window, "安装类型", "你选择了自定义安装");});QVBoxLayout *layout = new QVBoxLayout;layout->addWidget(btn1);layout->addWidget(btn2);window.setLayout(layout);window.setWindowTitle("QCommandLinkButton 示例");window.resize(300, 150);window.show();return app.exec();
}

输出结果:
在这里插入图片描述
QCommandLinkButton 实现 页面跳转联动:

#include <QApplication>
#include <QWidget>
#include <QCommandLinkButton>
#include <QPushButton>
#include <QStackedWidget>
#include <QVBoxLayout>
#include <QLabel>QWidget* createPage(const QString& title, const QString& text, QStackedWidget* stack) {QWidget* page = new QWidget;QVBoxLayout* layout = new QVBoxLayout(page);QLabel* label = new QLabel("<h2>" + title + "</h2><p>" + text + "</p>");label->setWordWrap(true);QPushButton* backBtn = new QPushButton("返回主页");QObject::connect(backBtn, &QPushButton::clicked, [=]() {stack->setCurrentIndex(0);});layout->addWidget(label);layout->addStretch();layout->addWidget(backBtn);return page;
}int main(int argc, char *argv[])
{QApplication app(argc, argv);QWidget window;window.setWindowTitle("Command Link Button 页面跳转示例");QStackedWidget *stack = new QStackedWidget;// 主页面(包含命令按钮)QWidget* mainPage = new QWidget;QVBoxLayout* mainLayout = new QVBoxLayout(mainPage);QCommandLinkButton* btnSetting = new QCommandLinkButton("进入设置页", "配置选项和参数");QCommandLinkButton* btnAbout   = new QCommandLinkButton("进入关于页", "了解软件信息");mainLayout->addWidget(btnSetting);mainLayout->addWidget(btnAbout);mainLayout->addStretch();// 其他页面QWidget* settingPage = createPage("设置页", "这里是设置内容区域。", stack);QWidget* aboutPage   = createPage("关于页", "这是软件的版本和开发者信息。", stack);// 添加到 stackstack->addWidget(mainPage);     // index 0stack->addWidget(settingPage);  // index 1stack->addWidget(aboutPage);    // index 2// 跳转信号连接QObject::connect(btnSetting, &QCommandLinkButton::clicked, [=]() {stack->setCurrentIndex(1);});QObject::connect(btnAbout, &QCommandLinkButton::clicked, [=]() {stack->setCurrentIndex(2);});// 主布局QVBoxLayout* mainLayoutAll = new QVBoxLayout(&window);mainLayoutAll->addWidget(stack);window.resize(400, 250);window.show();return app.exec();
}

输出结果:
请添加图片描述

六、按钮盒(QDialogButtonBox)

在 Qt 中,按钮盒(QDialogButtonBox) 是一个专门用于管理标准对话框按钮(如 OK、Cancel、Apply、Yes、No 等)的控件。它简化了按钮的创建、布局和信号连接,尤其适用于对话框(QDialog)中的操作按钮区域。

6.1 基本介绍

  • 自动排列标准按钮 OK/Cancel/Yes/No/Apply 等
  • 内置信号槽连接 如 accepted()、rejected()
  • 支持自定义按钮 addButton() 添加任意 QPushButton
  • 支持按钮角色控制 AcceptRole、RejectRole 等
  • 可设置按钮排列方向 setOrientation(Qt::Horizontal) 或 Vertical

6.2 常用标准按钮枚举

Qt 提供一套标准按钮,统一样式与行为:

QDialogButtonBox::Ok
QDialogButtonBox::Cancel
QDialogButtonBox::Yes
QDialogButtonBox::No
QDialogButtonBox::Apply
QDialogButtonBox::Reset

6.3 基础示例(标准按钮 + 自动信号)

#include <QApplication>
#include <QDialog>
#include <QDialogButtonBox>
#include <QVBoxLayout>
#include <QMessageBox>int main(int argc, char *argv[])
{QApplication app(argc, argv);QDialog dialog;dialog.setWindowTitle("QDialogButtonBox 示例");QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);QObject::connect(buttonBox, &QDialogButtonBox::accepted, [&dialog]() {QMessageBox::information(&dialog, "提示", "你点击了确定");dialog.accept();});QObject::connect(buttonBox, &QDialogButtonBox::rejected, [&dialog]() {QMessageBox::warning(&dialog, "提示", "你点击了取消");dialog.reject();});QVBoxLayout *layout = new QVBoxLayout;layout->addStretch();layout->addWidget(buttonBox);dialog.setLayout(layout);dialog.resize(300, 150);dialog.exec();return app.exec();
}

输出结果:
在这里插入图片描述

6.4 自定义按钮示例

也可以添加自定义按钮并设置其角色:

QPushButton* helpBtn = new QPushButton("帮助");
buttonBox->addButton(helpBtn, QDialogButtonBox::HelpRole);
connect(helpBtn, &QPushButton::clicked, [](){QMessageBox::information(nullptr, "帮助", "这里是帮助信息。");
});

相关文章:

Qt开发:按钮类的介绍和使用

文章目录 一、命令按钮类 &#xff08;QPushButton&#xff09;1.1 基本功能介绍1.2 常用构造函数1.3 常用方法1.4 信号与槽使用示例1.5 开关按钮&#xff08;Checkable&#xff09;1.6 创建出菜单按钮&#xff08;Menu Button&#xff09; 二、工具按钮类 &#xff08;QToolBu…...

Clickhouse基于breakpad生成minidump文件,方便问题定位

背景 breakpad能够在程序崩溃的时候自动生成一个mini的core文件&#xff0c;能够帮助进行问题定位&#xff0c;但是clickhouse对于集成breappad的难度较大 查看github发现之前有大佬基于以前的分支有个MR&#xff0c;但是一直没有合并到社区&#xff0c;想来是有什么其他的原因…...

华为云Astro轻应用自定义连接器对接OBS云对象存储操作指南

操作难点图例(详细见下文详细操作步骤) 操作成功图例 说明:以下是通过自定义连接器创建新的OBS桶的图例 说明:以下是通过自定义连接器将数据内容嵌入创建新的OBS桶的图例 操作难点图例 说明:连接器编排需要注意的是动作选择、输入参数的设置等...

C# 运算符重载深度解析:从基础到高阶实践

运算符重载是 C# 中一项强大的特性&#xff0c;它允许开发者为用户自定义类型定义运算符的行为&#xff0c;使得代码更直观、更符合领域逻辑。本文将通过理论解析与实战示例&#xff0c;全面讲解运算符重载的实现规则、适用场景及注意事项。 一、运算符重载的核心概念 1. 什么…...

面试现场“震”情百态:HashMap扩容记

&#xff08;以下为符合要求的文章内容&#xff09; 【场景】 2024年秋招季某互联网大厂会议室 面试官&#xff1a;张工&#xff08;P8级架构师&#xff09; 求职者&#xff1a;马小帅&#xff08;双非二本应届生&#xff09; 第一轮提问&#xff08;Java基础篇&#xff09; …...

SCAU18124--N皇后问题

18124 N皇后问题 时间限制:5000MS 代码长度限制:10KB 提交次数:0 通过次数:0 题型: 编程题 语言: G;GCC;VC Description 有N*N的国际象棋棋盘&#xff0c;要求在上面放N个皇后&#xff0c;要求任意两个皇后不会互杀&#xff0c;有多少种不同的放法&#xff1f; 输入格式 …...

MySQL 分库分表

对于使用 MySQL 作为数据库管理系统的应用来说&#xff0c;当数据量达到一定规模时&#xff0c;单库单表的架构会面临性能瓶颈&#xff0c;如查询缓慢、写入性能下降等问题。为了解决这些问题&#xff0c;可以使用分库分表技术。 二、为什么需要分库分表 2.1 单库单表的局限性…...

滑动窗口leetcode 904

代码&#xff1a; class Solution { public:int totalFruit(vector<int>& fruits) {int n fruits.size();unordered_map<int,int> window_type_count;int left 0;int ans 0;for(int right 0; right <n;right){while(window_type_count.size() 2 &&…...

用Maven定位和解决依赖冲突

用Maven定位和解决依赖冲突 一、依赖冲突的常见表现二、定位冲突依赖的4种方法2.1 使用Maven命令分析依赖树2.2 使用IDE可视化工具2.3 使用Maven Enforcer插件2.4 运行时分析 三、解决依赖冲突的5种方案3.1 排除特定传递依赖3.2 统一指定版本&#xff08;推荐&#xff09;3.3 使…...

八大排序之选择排序

本篇文章将带你详细了解八大基本排序中的选择排序 目录 &#xff08;一&#xff09;选择排序的时间复杂度和空间复杂度及稳定性分析 &#xff08;二&#xff09;代码实现 (三)输出结果 选择排序的基本原理是&#xff1a;每次从待排序的数组中找出最大值和最小值。具体流程是…...

SVM实战:从理论到鸢尾花数据集的分类可视化

SVM实战&#xff1a;从理论到鸢尾花数据集的分类可视化 在机器学习的广阔领域中&#xff0c;支持向量机&#xff08;Support Vector Machine&#xff0c;SVM&#xff09;作为一种经典且强大的分类算法&#xff0c;备受瞩目。它凭借独特的思想和卓越的性能&#xff0c;在模式识…...

深入解析 Stacking:集成学习的“超级英雄联盟

在机器学习的世界里&#xff0c;我们常常面临一个挑战&#xff1a;单一模型往往难以完美地解决复杂问题。就像漫威电影中的超级英雄们一样&#xff0c;每个模型都有自己的独特能力&#xff0c;但也有局限性。那么&#xff0c;如何让这些模型“联手”发挥更大的力量呢&#xff1…...

C# 编程核心:控制流与方法调用详解

在编程中&#xff0c;控制流和方法调用是构建程序逻辑的两大基石。它们决定了代码的执行顺序和模块化协作方式。本文将从基础概念出发&#xff0c;结合代码示例&#xff0c;深入解析这两部分内容。 控制流&#xff1a;程序执行的指挥棒 控制流决定了代码的执行路径&#xff0…...

PyTorch_张量基本运算

基本运算中&#xff0c;包括add, sub, mul, div, neg等函数&#xff0c;以及这些函数的带下划线的版本add_, sub_, mul_, div_, neg_, 其中带下划线的版本为修改原数据。 代码 import torch import numpy as np # 不修改原数据的计算 def test01():data torch.randint(0, 10…...

C++负载均衡远程调用学习之订阅功能与发布功能

目录 1.lars-DnsV0.1回顾 2.Lars-DnsV0.2-订阅功能的订阅模块分析 3.Lars-DnsV0.2-订阅模块的类的单例创建及方法属性初始化 4.Lars-DnsV0.2-发布功能的实现 5.Lars-DnsV0.2-发布功能的总结 6.Lars-DnsV0.2-订阅流程复习 7.Lars-DnsV0.2-订阅模块的集成 8.Lars-DnsV0.2订…...

接口测试的核心思维(基础篇)

1.为什么会进行接口测试&#xff1f; 早期发现问题&#xff0c;降低修复成本 当我们服务端已经完成&#xff0c;而前端还未进行开发的时候。我们可以通过接口测试避免前端的交互直接进行服务端的测试。 接口测试也能够更早介入项目的测试&#xff0c;降低修复成本。 提高测试…...

给文件内容加行号

题目&#xff1a; 给定一个文件&#xff0c;通过文件读写&#xff0c;给文件内容加行号。 行号形式如: 1:) xxXXXX 2:) xxxxXX 要求&#xff1a; 使用缓冲流操作。 思路分析&#xff1a; 程序定义了两个字符串变量 inputFile 和 outputFile&#xff0c;分别存储输入文件的路径…...

【计算机视觉】三维重建: MVSNet:基于深度学习的多视图立体视觉重建框架

MVSNet&#xff1a;基于深度学习的多视图立体视觉重建框架 技术架构与核心算法1. 算法流程2. 关键创新 环境配置与实战指南硬件要求安装步骤数据准备&#xff08;DTU数据集&#xff09; 实战流程1. 模型训练2. 深度图推断3. 点云生成 常见问题与解决方案1. CUDA内存不足2. 特征…...

终端与环境变量

一、我的电脑是Win10的&#xff0c;首先打开终端如下&#xff1a; 此时终端来到C:\Users\lenovo的目录下&#xff0c;可以访问该目录下的所有文件&#xff08;夹&#xff09;。另外&#xff0c;除了这个之外&#xff0c;终端还可以访问环境变量中的所有文件&#xff08;夹&…...

使用线性表实现通讯录管理

目录 &#x1f680;前言&#x1f99c;任务目标&#x1f31f;顺序表实现&#x1f40d;链表实现 &#x1f680;前言 大家好&#xff01;我是 EnigmaCoder。 本文介绍线性表的实验&#xff0c;使用顺序表和链表实现通讯录管理&#xff0c;包含初始化、插入、删除、查询、输出。 &a…...

机器学习常用评价指标

1. 指标说明 (1) AccuracyClassification&#xff08;准确率&#xff09; • 计算方式&#xff1a;accuracy_score(y_true, y_pred) • 作用&#xff1a; 衡量模型正确预测的样本比例&#xff08;包括所有类别&#xff09;。 公式&#xff1a; Accuracy TP TN TP TN FP…...

基于ArduinoIDE的任意型号单片机 + GPS北斗BDS卫星定位

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言1.1 器件选择1.2 接线方案 二、驱动实现2.1 核心代码解析&#xff08;arduino/ESP32-S3&#xff09; 三、坐标解析代码四、典型问题排查总结 前言 北斗卫星导航…...

CGAL:创建点、线、三角形及其距离、关系

CGAL&#xff08;Computational Geometry Algorithms Library&#xff0c;计算几何算法库&#xff09;是一个强大的开源库&#xff0c;为众多几何计算问题提供了高效的解决方案&#xff0c;在计算几何领域应用广泛。以下将基于提供的代码示例&#xff0c;详细介绍如何利用 CGAL…...

STM32基础教程——软件I2C

目录 前言 I2C MPU6050 技术实现 原理图 连线图 代码实现 技术要点 I2C初始化 SCL输出和SDA输入输出控制 起始信号 停止信号 发送一个字节 读取一个字节 发送应答位 接收应答位 MPU6050初始化 指定地址写 指定地址读 读取数据寄存器 问题记录 前言 I2C …...

Xilinx FPGA | 管脚约束 / 时序约束 / 问题解析

注&#xff1a;本文为 “Xilinx FPGA | 管脚约束 / 时序约束 / 问题解析” 相关文章合辑。 略作重排&#xff0c;未整理去重。 如有内容异常&#xff0c;请看原文。 Xilinx FPGA 管脚 XDC 约束之&#xff1a;物理约束 FPGA技术实战 于 2020-02-04 17:14:53 发布 说明&#x…...

应用层自定义协议序列与反序列化

目录 一、网络版计算器 二、网络版本计算器实现 2.1源代码 2.2测试结果 一、网络版计算器 应用层定义的协议&#xff1a; 应用层进行网络通信能否使用如下的协议进行通信呢&#xff1f; 在操作系统内核中是以这种协议进行通信的&#xff0c;但是在应用层禁止以这种协议进行…...

大数据:数字时代的驱动力

📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 随着互联网和技术的迅猛发展,数据已经成为现代社会最宝贵的资源之一。大数据(Big Data)作为一种全新的信息资源,正以前所未有的方式改变着各个行业的运作模式,推动着社会的进步与创新。无论是金…...

java学习之数据结构:二、链表

本节介绍链表 目录 1.什么是链表 1.1链表定义 1.2链表分类 2.链表实现 2.1创建链表 1&#xff09;手动创建 2&#xff09;创建链表类进行管理链表的相关操作 2.2添加元素 1&#xff09;头插法 2&#xff09;尾插法 3&#xff09;任意位置插入 2.3删除 2.4查找 1&…...

评估动态化烹饪工艺与营养实训室建设要点

在全民健康意识显著提升、健康饮食理念深度普及的时代背景下&#xff0c;烹饪工艺与营养实训室建设要点已不再局限于传统单一的技能训练模式。需以行业需求为导向&#xff0c;通过功能集成化设计推动革新 —— 将食品安全防控、营养科学分析、智能烹饪技术、餐饮运营管理等多元…...

Java学习手册:关系型数据库基础

一、关系型数据库概述 关系型数据库是一种基于关系模型的数据库&#xff0c;它将数据组织成一个或多个表&#xff08;或称为关系&#xff09;&#xff0c;每个表由行和列组成。每一列都有一个唯一的名字&#xff0c;称为属性&#xff0c;表中的每一行是一个元组&#xff0c;代…...

吾爱出品 [Windows] EndNote 21.5.18513 汉化补丁

[Windows] EndNote 链接&#xff1a;https://pan.xunlei.com/s/VOPLLs6DqKNz-EoBSWVRTSmGA1?pwd9isc# Thomson Scientific公司推出了2025&#xff0c;本次的endnote21大概率是最后一个版本啦&#xff0c;现已决定进行更新。 本次采用的环境为python3.12&#xff0c;win11&am…...

Sentinel学习

sentinel是阿里巴巴研发的一款微服务组件&#xff0c;主要为用户提供服务保护&#xff0c;包括限流熔断等措施 &#xff08;一&#xff09;主要功能 流量控制&#xff08;限流&#xff09;&#xff1a;比如限制1s内有多少请求能到达服务器&#xff0c;防止大量请求打崩服务器…...

【中间件】brpc_基础_execution_queue

execution_queue 源码 1 简介 execution_queue.h 是 Apache BRPC 中实现 高性能异步任务执行队列 的核心组件&#xff0c;主要用于在用户态线程&#xff08;bthread&#xff09;中实现任务的 异步提交、有序执行和高效调度。 该模块通过解耦任务提交与执行过程&#xff0c;提…...

Servlet(二)

软件架构 1. C/S 客户端/服务器端 2. B/S 浏览器/服务器端&#xff1a; 客户端零维护&#xff0c;开发快 资源分类 1. 静态资源 所有用户看到相同的部分&#xff0c;如&#xff1a;html,css,js 2. 动态资源 用户访问相同资源后得到的结果可能不一致&#xff0c;如&#xff1a;s…...

如何提升个人的思维能力?

提升个人的逻辑思维能力是一个系统性工程&#xff0c;需要长期训练和科学方法。以下是分阶段、可操作的详细建议&#xff0c;涵盖理论基础、日常训练和实战应用&#xff1a; 一、构建逻辑基础认知 1. 学习逻辑学核心理论 入门读物&#xff1a;《简单的逻辑学》麦克伦尼&am…...

[UVM]UVM中reg_map的作用及多个rem_map的使用案例

UVM中reg_map的作用及多个rem_map的使用案例 摘要:在 UVM (Universal Verification Methodology) 中,寄存器模型是用于验证 DUT (Design Under Test) 寄存器行为的重要工具。UVM 寄存器模型中的 uvm_reg_map(简称 reg_map)是寄存器模型的核心组成部分之一,用于定义…...

重新构想E-E-A-T:提升销售与搜索可见性的SEO策略

在2025年的数字营销环境中&#xff0c;谷歌的E-E-A-T&#xff08;经验、专业性、权威性、可信度&#xff09;已成为SEO和内容营销的核心支柱。传统的E-E-A-T优化方法通常聚焦于展示作者资质或获取反向链接&#xff0c;但这些策略可能不足以应对AI驱动的搜索和日益挑剔的用户需求…...

AI 采用金字塔(Sohn‘s AI Adoption Pyramid)

这张图是 Sohn 的 AI 采用金字塔&#xff08;Sohn’s AI Adoption Pyramid&#xff09; &#xff0c;用于描述不同程度的 AI 应用层次&#xff0c;各层次意义如下&#xff1a; 金字塔层级 Level 1&#xff1a;业务角色由人类主导&#xff0c;AI 起辅助作用&#xff0c;如 AI …...

影刀RPA中新增自己的自定义指令

入门到实战明细 1. 影刀RPA自定义指令概述 1.1 定义与作用 影刀RPA的自定义指令是一种强大的功能&#xff0c;旨在提高流程复用率&#xff0c;让用户能够个性化定制指令&#xff0c;实现流程在不同应用之间的相互调用。通过自定义指令&#xff0c;用户可以将常用的、具有独立…...

驱动总裁v2.19(含离线版)驱动工具软件下载及安装教程

1.软件名称&#xff1a;驱动总裁 2.软件版本&#xff1a;2.19 3.软件大小&#xff1a;602 MB 4.安装环境&#xff1a;win7/win10/win11 5.下载地址&#xff1a; https://www.kdocs.cn/l/cdZMwizD2ZL1?RL1MvMTM%3D 提示&#xff1a;先转存后下载&#xff0c;防止资源丢失&am…...

SQL经典实例

第1章 检索记录 1.1 检索所有行和列 知识点&#xff1a;使用SELECT *快速检索表中所有列&#xff1b;显式列出列名&#xff08;如SELECT col1, col2&#xff09;提高可读性和可控性&#xff0c;尤其在编程场景中更清晰。 1.2 筛选行 知识点&#xff1a;通过WHERE子句过滤符合条…...

2025深圳杯(东三省)数学建模竞赛D题完整分析论文(共36页)(含模型、可运行代码、数据结果)

2025深圳杯数学建模竞赛D题完整分析论文 目录 摘 要 一、问题重述 二、问题分析 三、模型假设 四、符号定义 五、问题一模型的建立与求解 5.1 问题一模型的建立 5.1.1 问题建模背景 5.1.2 特征工程设计 5.1.3 分类模型结构与数学表达 5.2 问题一模型的求…...

大数据技术:从趋势到变革的全景探索

📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 在数字化时代的浪潮下,大数据已经不再是一个陌生的概念。从日常生活中的社交媒体,到企业决策支持系统,再到公共管理的大数据应用,它正在改变着我们的工作和生活方式。随着技术的进步,传统的数据…...

C++【内存管理】

C语言中的动态内存管理 int main() { int* p2(int*)calloc(4,sizeof(int)); int* p3(int*)realloc(p2,sizeof(int)*10); free(p3); }这里因为扩容数据小,所以是原地扩容,p2p3地址一样,不用free(p2) 如果扩容空间大就不是原地扩容,而是新找一块空间,然后拷贝 C内存管理方式 n…...

【Go类库分享】mcp-go Go搭建MCP服务

【Go类库分享】mcp-go Go搭建MCP服务 介绍 目前Go 生态圈有两个知名的开发 MCP 的库&#xff0c;一个是mark3labs/mcp-go,另一个是metoro-io/mcp-golang。 在介绍常用库之前&#xff0c;先来简单介绍一下mcp协议&#xff1a; MCP全称Model Context Protocol 模型上下文协议&a…...

人工智能发展史 — 物理学诺奖之 Hopfield 联想和记忆神经网络模型

目录 文章目录 目录1982 年&#xff0c;Hopfield 联想和记忆神经网络模型背景知识历史&#xff1a;霍普菲尔德简介神经学&#xff1a;大脑的联想记忆机制物理学&#xff1a;磁性材料的自旋玻璃理论和能量最小值函数 Hopfield 神经网络基本原理记忆存储&#xff08;训练&#xf…...

Docker —— 技术架构的演进

Docker —— 技术架构的演进 技术架构演进总结单机架构优点缺点总结 应用数据分离架构优点缺点总结 应用服务集群架构1. Nginx2. HAProxy3. LVS&#xff08;Linux Virtual Server&#xff09;4. F5 BIG-IP对比总结选型建议 读写分离/主从分离架构1. MyCat简介 2. TDDL&#xff…...

Docker与WSL2如何清理

文章目录 Docker与WSL2如何清理一、docker占据磁盘空间核心原因分析1. WSL2 虚拟磁盘的动态扩展特性2. Docker 镜像分层缓存与未清理资源 二、解决方案步骤 1&#xff1a;清理 Docker 未使用的资源步骤 2&#xff1a;手动压缩 WSL2 虚拟磁盘1. 关闭 WSL2 和 Docker Desktop2. 定…...

单片机嵌入式按键库

kw_btn库说明 本库主要满足嵌入式按键需求&#xff0c;集成了常用的按键响应事件&#xff1a;高电平、低电平、上升沿、下降沿、单击、双击、长按键事件。可以裸机运行&#xff0c;也可以配合实时操作系统运行。 本库开源连接地址&#xff1a;gitee连接 实现思路 本库采用C语…...

多多铃声 7.4| 拥有丰富的铃声曲库,满足不同用户的个性化需求,支持一键设置手机铃声

多多铃声是一款提供丰富铃声资源的应用程序&#xff0c;它拥有广泛的铃声曲库&#xff0c;涵盖各种风格和类型&#xff0c;能够满足不同用户的个性化需求。该应用程序支持分类浏览和热门榜单功能&#xff0c;让用户可以轻松找到当前最流行或自己感兴趣的铃声。此次分享的版本为…...