Qt Widgets模块功能详细说明,基本控件:QPushButton(二)
一、基本控件(Widgets)
Qt 提供了丰富的基本控件,如按钮、标签、文本框、复选框、单选按钮、列表框、组合框、菜单、工具栏等。
1、QPushButton
1.1、概述 (用途、继承关系)
QPushButton 是 Qt 框架中用于创建按钮的控件,它的主要功能是响应用户点击,触发特定操作,例如提交表单、打开窗口或执行命令。
继承关系
QPushButton 继承自以下类(基于 Qt 的 C++ 继承链):
-
QAbstractButton:提供按钮的通用功能(如点击、按下、释放、复选等)。
-
QWidget:提供基本窗口部件功能(如大小、位置、事件处理)。
-
QObject:提供信号与槽机制、事件系统等。
1.2、常用属性 (文本、图标、是否可用、是否选中等)
-
文本 (text)
-
描述:按钮上显示的文本内容。
-
获取/设置:button.text() / button.setText("文本")。
-
示例:button.setText("点击我")。
-
-
图标 (icon)
-
描述:按钮上显示的图标,支持多种图片格式(如 PNG、JPG)。
-
获取/设置:button.icon() / button.setIcon(QIcon("path/to/icon.png"))。
-
示例:button.setIcon(QIcon("icon.png"))。
-
-
是否可用 (enabled)
-
描述:控制按钮是否可交互。禁用时按钮变灰,无法点击。
-
获取/设置:button.isEnabled() / button.setEnabled(False)。
-
示例:button.setEnabled(False) 禁用按钮。
-
-
是否选中 (checked)
-
描述:当按钮设置为可切换(checkable)时,控制选中状态。
-
获取/设置:button.isChecked() / button.setChecked(True)。
-
前提:需设置 button.setCheckable(True)。
-
示例:button.setCheckable(True); button.setChecked(True)。
-
-
快捷键 (shortcut)
-
描述:为按钮绑定键盘快捷键,按下快捷键等同于点击按钮。
-
设置:button.setShortcut("Ctrl+S")。
-
示例:button.setShortcut("Enter")。
-
-
默认按钮 (default)
-
描述:设置为窗口的默认按钮,按 Enter 键时自动触发。
-
设置:button.setDefault(True)。
-
-
自动重复 (autoRepeat)
-
描述:长按按钮时是否重复触发点击事件。
-
设置:button.setAutoRepeat(True)。
-
-
工具提示 (toolTip)
-
描述:鼠标悬停时显示的提示文本。
-
设置:button.setToolTip("这是一个按钮")。
-
#include <QApplication>
#include <QMainWindow>
#include <QPushButton>
#include <QVBoxLayout>
#include <QWidget>
#include <QIcon>
#include <QDebug> // 用于输出调试信息int main(int argc, char *argv[])
{QApplication a(argc, argv);// 创建主窗口QMainWindow mainWindow;mainWindow.setWindowTitle("QPushButton 属性示例");// 创建中心 widget 和布局QWidget *centralWidget = new QWidget(&mainWindow);QVBoxLayout *layout = new QVBoxLayout(centralWidget);//===========================// 1. 创建一个 QPushButton//===========================QPushButton *button = new QPushButton(centralWidget);//==============================// 2. 设置文本 (text)//==============================button->setText("点击我");//=========================// 3. 设置图标 (icon)//=========================button->setIcon(QIcon(":/images/save.png"));button->setIconSize(QSize(24, 24)); // 设置图标大小,可选//==================================// 4. 设置是否可用 (enabled)//==================================button->setEnabled(true); // 默认是可用的,这里显式设置// button->setEnabled(false); // 禁用按钮的示例//==================================================// 5. 设置是否选中 (checked) - 需要先设置为可切换//==================================================button->setCheckable(true);button->setChecked(false); // 默认不选中// button->setChecked(true); // 设置为选中状态的示例// 连接 checked() 信号到一个槽函数,用于演示选中状态的变化QObject::connect(button, &QPushButton::clicked, [](bool checked){qDebug() << "按钮选中状态改变:" << checked;});//====================================// 6. 设置快捷键 (shortcut)//====================================button->setShortcut(QKeySequence("Ctrl+S")); // 设置 Ctrl+S 为快捷键// button->setShortcut(QKeySequence(Qt::Key_Return)); // 设置 Enter 键为快捷键// 连接 clicked() 信号到一个槽函数,用于演示快捷键触发QObject::connect(button, &QPushButton::clicked, [](){qDebug() << "按钮被点击或通过快捷键触发!";});//====================================// 7. 设置默认按钮 (default)//====================================// 通常在对话框中使用,按 Enter 键时触发// 在主窗口中,默认按钮的行为可能不明显,但在 QDialog 中很重要。button->setDefault(false); // 默认不是默认按钮// button->setDefault(true); // 设置为默认按钮的示例//================================// 8. 设置自动重复 (autoRepeat)//================================
// button->setAutoRepeat(false); // 默认不自动重复button->setAutoRepeat(true); // 设置为自动重复的示例//==============================// 9. 设置工具提示 (toolTip)//=============================button->setToolTip("这是一个非常有用的按钮");// 将按钮添加到布局layout->addWidget(button);// 设置中心 widgetmainWindow.setCentralWidget(centralWidget);// 显示主窗口mainWindow.show();return a.exec();
}
1.3、常用方法 (点击模拟、设置文本、设置图标等)
-
点击模拟
-
click():模拟用户点击按钮,触发 clicked 信号。
-
示例:button.click()。
-
-
设置文本
-
setText(str):设置按钮的显示文本。
-
示例:button.setText("确认")。
-
-
设置图标
-
setIcon(QIcon):设置按钮图标。
-
示例:button.setIcon(QIcon("icon.png"))。
-
-
设置图标大小
-
setIconSize(QSize):设置图标的显示大小。
-
示例:button.setIconSize(QSize(32, 32))。
-
-
设置是否可切换
-
setCheckable(bool):设置按钮是否具有复选(开关)功能。
-
示例:button.setCheckable(True)。
-
-
设置选中状态
-
setChecked(bool):设置按钮的选中状态(需先设为可切换)。
-
示例:button.setChecked(True)。
-
-
设置快捷键
-
setShortcut(str):为按钮绑定快捷键。
-
示例:button.setShortcut("Ctrl+Q")。
-
-
设置默认按钮
-
setDefault(bool):将按钮设为默认按钮。
-
示例:button.setDefault(True)。
-
1.4、常用信号 (点击、按下、释放、切换状态等)
-
clicked(bool)
-
触发时机:按钮被点击时。
-
参数:如果按钮是可切换的,参数为 checked 状态(True/False)。
-
示例:connect(button, &QPushButton::clicked, this, &MainWindow::onButtonClicked);
-
-
pressed()
-
触发时机:按钮被按下时(鼠标按下但未释放)。
-
示例:connect(button, &QPushButton::pressed, this, &MainWindow::onButtonPressed);
-
-
released()
-
触发时机:按钮被释放时(鼠标按下后释放)。
-
示例:connect(button, &QPushButton::released, this, &MainWindow::onButtonReleased);
-
-
toggled(bool)
-
触发时机:当按钮是可切换的(checkable=True)且选中状态改变时。
-
参数:当前选中状态(True/False)。
-
示例:connect(button, &QPushButton::toggled, this, &MainWindow::onButtonToggled);
-
#include <QApplication>
#include <QMainWindow>
#include <QPushButton>
#include <QVBoxLayout>
#include <QWidget>
#include <QDebug> // 用于输出调试信息class MyWindow : public QMainWindow
{Q_OBJECT // 需要这个宏来使用信号和槽public:MyWindow(QWidget *parent = nullptr) : QMainWindow(parent){setWindowTitle("QPushButton 信号示例");QWidget *centralWidget = new QWidget(this);QVBoxLayout *layout = new QVBoxLayout(centralWidget);QPushButton *button = new QPushButton("测试按钮", centralWidget);//=================================================// 设置按钮为可切换,以便演示 toggled 信号//=================================================button->setCheckable(true);//==============================================// 连接 clicked(bool) 信号//==============================================// 如果按钮可切换,clicked 信号会带一个 bool 参数表示是否选中// 如果按钮不可切换,clicked 信号不带参数,但这里使用带 bool 参数的重载也兼容connect(button, &QPushButton::clicked, this, &MyWindow::onButtonClicked);//===================================// 连接 pressed() 信号//===================================connect(button, &QPushButton::pressed, this, &MyWindow::onButtonPressed);//===================================// 连接 released() 信号//===================================connect(button, &QPushButton::released, this, &MyWindow::onButtonReleased);//======================================================// 连接 toggled(bool) 信号 (仅在按钮可切换时触发)//======================================================connect(button, &QPushButton::toggled, this, &MyWindow::onButtonToggled);layout->addWidget(button);centralWidget->setLayout(layout);setCentralWidget(centralWidget);}private slots:// 槽函数用于处理 clicked 信号void onButtonClicked(bool checked){qDebug() << "Clicked Signal! Checked state:" << checked;}// 槽函数用于处理 pressed 信号void onButtonPressed(){qDebug() << "Pressed Signal!";}// 槽函数用于处理 released 信号void onButtonReleased(){qDebug() << "Released Signal!";}// 槽函数用于处理 toggled 信号void onButtonToggled(bool checked){qDebug() << "Toggled Signal! New checked state:" << checked;}
};#include "main.moc" // 如果你将 MyWindow 类放在 main.cpp 中,需要包含这个文件int main(int argc, char *argv[])
{QApplication a(argc, argv);MyWindow window;window.show();return a.exec();
}
1.5、样式表应用
QPushButton 支持使用 Qt 样式表 (QSS) 自定义外观,类似于 CSS。
-
background-color:设置背景颜色。
-
border-radius:设置圆角。
-
padding:设置内边距。
-
:hover、:pressed、:disabled、:checked:伪类选择器,分别对应鼠标悬停、按下、禁用和选中状态。
基本样式:默认样式、悬停样式、按下样式、不可用样式
button->setStyleSheet("QPushButton {"" background-color: #4CAF50;"" color: white;"" border-radius: 5px;"" padding: 6px;"" font-size: 14px;""}""QPushButton:hover {"" background-color: #45a049;""}""QPushButton:pressed {"" background-color: #3d8b40;""}""QPushButton:disabled {"" background-color: #cccccc;"" color: #666666;""}"
);
带图标的按钮样式
button->setStyleSheet("QPushButton {"" icon-size: 24px;"" padding-left: 30px;" /* 为图标留空间 */" text-align: left;""}"
);
开关按钮样式
button->setStyleSheet("QPushButton {"" background-color: #cccccc;"" border: 1px solid #aaaaaa;""}""QPushButton:checked {"" background-color: #4CAF50;"" border: 1px solid #3d8b40;""}"
);
2、QToolButton
2.1、概述 (用途、与 QPushButton 的区别、继承关系)
QToolButton 是 Qt 框架中的一种按钮控件,主要用于工具栏(QToolBar)或需要紧凑、图标驱动的界面元素。它通常用于提供快速访问的功能,例如工具栏中的“保存”、“撤销”或“设置”等操作。
2.1.1、与 QPushButton 的区别
-
用途与外观:
-
QPushButton 是一个通用按钮,通常显示文本或简单的图标,适合对话框或表单。
-
QToolButton 专为工具栏设计,默认以图标为主,文本为辅,支持更复杂的交互(如弹出菜单、箭头指示)。
-
-
大小与布局:
-
QToolButton 默认更小巧,适合工具栏的紧凑布局。
-
QPushButton 通常更大,适合独立按钮或表单布局。
-
-
功能支持:
-
QToolButton 支持弹出菜单、箭头类型、工具提示等,适合工具栏的动态交互。
-
QPushButton 功能更简单,主要是点击触发操作。
-
-
默认行为:
-
QToolButton 默认没有边框,适合工具栏的无缝风格。
-
QPushButton 默认有边框和背景,视觉上更突出。
-
2.1.2、继承关系
QToolButton 继承自以下类(基于 Qt 的 C++ 继承链):
-
QAbstractButton:提供按钮的通用功能(如点击、按下、释放、复选等)。
-
QWidget:提供基本窗口部件功能(如大小、位置、事件处理)。
-
QObject:提供信号与槽机制、事件系统等。
QToolButton 继承了 QAbstractButton 的所有基本按钮功能(如点击、切换、文本设置等),并扩展了工具栏特定的功能。
2.2、常用属性 (图标、文本、箭头类型、弹出模式等)
ToolButton 提供多种属性,用于控制其外观和行为。
-
图标(icon):
-
属性:icon(类型:QIcon)
-
描述:设置按钮的图标,通常是工具栏按钮的主要视觉元素。
-
示例:toolButton->setIcon(QIcon(":/icons/save.png"));
-
-
文本(text):
-
属性:text(类型:QString)
-
描述:设置按钮的显示文本,通常在图标下方或旁边显示。
-
示例:toolButton->setText("Save");
-
-
工具按钮样式(toolButtonStyle):
-
属性:toolButtonStyle(类型:Qt::ToolButtonStyle)
-
描述:控制图标和文本的显示方式,支持以下枚举值:
-
Qt::ToolButtonIconOnly:仅显示图标(默认)。
-
Qt::ToolButtonTextOnly:仅显示文本。
-
Qt::ToolButtonTextBesideIcon:文本在图标旁边。
-
Qt::ToolButtonTextUnderIcon:文本在图标下方。
-
Qt::ToolButtonFollowStyle:遵循系统样式。
-
-
示例:toolButton->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
-
-
箭头类型(arrowType):
-
属性:arrowType(类型:Qt::ArrowType)
-
描述:设置按钮是否显示箭头以及箭头方向,用于指示弹出菜单或特定状态。支持:
-
Qt::NoArrow:无箭头(默认)。
-
Qt::UpArrow、Qt::DownArrow、Qt::LeftArrow、Qt::RightArrow:显示指定方向的箭头。
-
-
示例:toolButton->setArrowType(Qt::DownArrow);
-
-
弹出模式(popupMode):
-
属性:popupMode(类型:QToolButton::ToolButtonPopupMode)
-
描述:定义按钮关联菜单的弹出行为,支持以下模式:
-
QToolButton::DelayedPopup:长按后弹出菜单(默认)。
-
QToolButton::MenuButtonPopup:点击箭头部分弹出菜单,点击图标触发默认动作。
-
QToolButton::InstantPopup:点击按钮立即弹出菜单。
-
-
示例:toolButton->setPopupMode(QToolButton::MenuButtonPopup);
-
-
自动升起(autoRaise):
-
属性:autoRaise(类型:bool)
-
描述:启用时,按钮在未按下时呈现“平面”外观,鼠标悬停时升起,适合工具栏风格。默认开启。
-
示例:toolButton->setAutoRaise(true);
-
-
工具提示(toolTip):
-
属性:toolTip(类型:QString)
-
描述:设置鼠标悬停时的提示文本。
-
示例:toolButton->setToolTip("Save the document");
-
-
启用状态(enabled):
-
属性:enabled(类型:bool)
-
描述:控制按钮是否可交互,禁用时呈灰色。
-
示例:toolButton->setEnabled(false);
-
#include <QApplication>
#include <QMainWindow>
#include <QToolButton>
#include <QVBoxLayout>
#include <QWidget>
#include <QIcon>
#include <QMenu>
#include <QDebug> // 用于输出调试信息int main(int argc, char *argv[])
{QApplication a(argc, argv);// 创建主窗口QMainWindow mainWindow;mainWindow.setWindowTitle("QToolButton 属性示例");// 创建中心 widget 和布局QWidget *centralWidget = new QWidget(&mainWindow);QVBoxLayout *layout = new QVBoxLayout(centralWidget);// 创建一个 QToolButtonQToolButton *toolButton = new QToolButton(centralWidget);//=============================// 1. 设置图标 (setIcon)//=============================toolButton->setIcon(QIcon(":/images/save.png"));toolButton->setIconSize(QSize(32, 32)); // 可选:设置图标大小//================================// 2. 设置文本 (setText)//================================toolButton->setText("保存");//==============================================// 3. 设置工具按钮样式 (setToolButtonStyle)//==============================================toolButton->setToolButtonStyle(Qt::ToolButtonTextUnderIcon); // 文本在图标下方// 尝试其他样式:// toolButton->setToolButtonStyle(Qt::ToolButtonIconOnly); // 仅图标 (默认)// toolButton->setToolButtonStyle(Qt::ToolButtonTextOnly); // 仅文本// toolButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); // 文本在图标旁边// toolButton->setToolButtonStyle(Qt::ToolButtonFollowStyle); // 遵循系统样式//=============================================// 4. 设置箭头类型 (setArrowType)//=============================================//toolButton->setArrowType(Qt::DownArrow); // 显示向下箭头,图标冲突// 尝试其他箭头类型:toolButton->setArrowType(Qt::NoArrow); // 无箭头 (默认)// toolButton->setArrowType(Qt::UpArrow); // 向上箭头// toolButton->setArrowType(Qt::LeftArrow); // 向左箭头// toolButton->setArrowType(Qt::RightArrow); // 向右箭头//====================================================// 5. 设置弹出模式 (setPopupMode) - 需要关联一个菜单//====================================================QMenu *menu = new QMenu(toolButton);menu->addAction("动作一");menu->addAction("动作二");toolButton->setMenu(menu); // 关联菜单toolButton->setPopupMode(QToolButton::MenuButtonPopup); // 点击箭头弹出菜单// 尝试其他弹出模式:// toolButton->setPopupMode(QToolButton::DelayedPopup); // 长按弹出菜单 (默认)// toolButton->setPopupMode(QToolButton::InstantPopup); // 点击按钮立即弹出菜单// 连接 clicked 信号,演示点击事件(在 MenuButtonPopup 模式下,点击图标区域触发)QObject::connect(toolButton, &QToolButton::clicked, [](){qDebug() << "QToolButton 被点击 (可能触发了默认动作)!";});//=====================================// 6. 设置自动升起 (setAutoRaise)//=====================================toolButton->setAutoRaise(true); // 默认开启,使其在工具栏中外观更协调//===========================================// 7. 设置工具提示 (setToolTip)//===========================================toolButton->setToolTip("保存当前文档");//=========================================// 8. 设置启用状态 (setEnabled)//=========================================toolButton->setEnabled(true); // 默认是可用的,这里显式设置// toolButton->setEnabled(false); // 禁用按钮的示例// 将工具按钮添加到布局layout->addWidget(toolButton);// 设置中心 widgetmainWindow.setCentralWidget(centralWidget);// 显示主窗口mainWindow.show();return a.exec();
}
效果:
2.3、常用方法 (设置图标、设置菜单等)
QToolButton 的常用方法,用于设置和控制按钮的行为。
-
设置图标:
-
方法:setIcon(const QIcon &icon)
-
描述:设置按钮的图标。
toolButton->setIcon(QIcon(":/icons/save.png"));
-
-
设置菜单:
-
方法:setMenu(QMenu *menu)
-
描述:为按钮关联一个弹出菜单。
QMenu *menu = new QMenu(toolButton); menu->addAction("Option 1"); menu->addAction("Option 2"); toolButton->setMenu(menu);
-
-
设置默认动作:
-
方法:setDefaultAction(QAction *action)
-
描述:将一个 QAction 与按钮绑定,自动同步动作的图标、文本、工具提示等。
QAction *action = new QAction(QIcon(":/icons/save.png"), "Save", toolButton); toolButton->setDefaultAction(action);
-
-
设置工具按钮样式:
-
方法:setToolButtonStyle(Qt::ToolButtonStyle style)
-
描述:设置图标和文本的显示方式。
toolButton->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
-
-
设置弹出模式:
-
方法:setPopupMode(ToolButtonPopupMode mode)
-
描述:(promised)设置菜单弹出模式。
toolButton->setPopupMode(QToolButton::InstantPopup);
-
-
显示/隐藏:
-
方法:show(), hide()
-
描述:控制按钮的可见性。
-
示例:toolButton->hide();
-
2.4、常用信号 (点击、菜单弹出等)
QToolButton 继承了 QAbstractButton 的信号,并添加了一些特定信号。常用信号包括:
-
clicked():
-
描述:按钮被点击时发出。
-
示例:
connect(toolButton, &QToolButton::clicked, this, &MyClass::onButtonClicked);
-
-
triggered(QAction *action):
-
描述:当按钮关联的菜单动作被触发时发出。
-
示例:
connect(toolButton, &QToolButton::triggered, this, &MyClass::onMenuActionTriggered);
-
-
pressed():
-
描述:按钮被按下时发出。
-
示例:
connect(toolButton, &QToolButton::pressed, this, &MyClass::onButtonPressed);
-
-
released():
-
描述:按钮被释放时发出。
-
示例:
connect(toolButton, &QToolButton::released, this, &MyClass::onButtonReleased);
-
2.5、样式表应用
QToolButton 支持 Qt 样式表(QSS)自定义外观。
自定义背景和边框:
toolButton->setStyleSheet("QToolButton {"" background-color: #4CAF50;"" border: 1px solid #388E3C;"" border-radius: 4px;"" padding: 5px;""}""QToolButton:hover {"" background-color: #45A049;""}""QToolButton:pressed {"" background-color: #3D8B40;""}"
);
自定义图标大小:
toolButton->setStyleSheet("QToolButton {"" icon-size: 32px;""}"
);
禁用状态样式:
toolButton->setStyleSheet("QToolButton:disabled {"" background-color: #CCCCCC;"" color: #666666;""}"
);
菜单箭头样式:
toolButton->setStyleSheet("QToolButton::menu-indicator {"" image: url(:/icons/arrow-down.png);"" width: 10px;"" height: 10px;""}"
);
2.6、应用示例
#include <QApplication>
#include <QMainWindow>
#include <QToolBar>
#include <QToolButton>
#include <QMenu>
#include <QMessageBox>
#include <QDebug>
#include <QTimer>class MainWindow : public QMainWindow {Q_OBJECT
public:MainWindow(QWidget *parent = nullptr) : QMainWindow(parent), isDocumentSaved(true) {// 创建工具栏QToolBar *toolbar = new QToolBar("Main Toolbar", this);toolbar->setMovable(false); // 禁止拖动工具栏addToolBar(Qt::TopToolBarArea, toolbar);//=======================// 1. 保存按钮//=======================saveButton = new QToolButton(this);saveButton->setIcon(QIcon(":/images/save.png"));saveButton->setToolTip("Save File (Ctrl+S)");saveButton->setShortcut(QKeySequence("Ctrl+S"));saveButton->setToolButtonStyle(Qt::ToolButtonIconOnly);saveButton->setAutoRaise(true);connect(saveButton, &QToolButton::clicked, this, &MainWindow::onSaveClicked);toolbar->addWidget(saveButton);toolbar->addSeparator(); // 添加分隔符//=============================// 2. 格式选择按钮(带下拉菜单)//=============================formatButton = new QToolButton(this);formatButton->setIcon(QIcon(":/images/format.png"));formatButton->setText("Format");formatButton->setToolTip("Choose file format");formatButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);formatButton->setPopupMode(QToolButton::MenuButtonPopup);QMenu *formatMenu = new QMenu(this);formatMenu->addAction("PDF");formatMenu->addAction("DOCX");formatMenu->addAction("TXT");formatButton->setMenu(formatMenu);connect(formatButton, &QToolButton::triggered, this, &MainWindow::onFormatSelected);connect(formatButton, &QToolButton::clicked, this, &MainWindow::onFormatButtonClicked);toolbar->addWidget(formatButton);toolbar->addSeparator();//=================================// 3. 撤销按钮(动态启用/禁用)//=================================undoButton = new QToolButton(this);undoButton->setIcon(QIcon(":/images/undo.png"));undoButton->setToolTip("Undo (Ctrl+Z)");undoButton->setShortcut(QKeySequence("Ctrl+Z"));undoButton->setToolButtonStyle(Qt::ToolButtonIconOnly);undoButton->setEnabled(false); // 默认禁用connect(undoButton, &QToolButton::clicked, this, &MainWindow::onUndoClicked);toolbar->addWidget(undoButton);// 模拟文档编辑状态变化的定时器(仅用于演示)QTimer *timer = new QTimer(this);connect(timer, &QTimer::timeout, this, &MainWindow::simulateDocumentChange);timer->start(5000); // 每5秒模拟文档变化}private slots:// 保存按钮点击void onSaveClicked() {isDocumentSaved = true;saveButton->setIcon(QIcon(":/images/saved.png")); // 更新图标QMessageBox::information(this, "Save", "File saved successfully!");}// 格式按钮点击(非菜单部分)void onFormatButtonClicked() {QMessageBox::information(this, "Format", "Default format action triggered!");}// 格式菜单选择void onFormatSelected(QAction *action) {QString format = action->text();QMessageBox::information(this, "Format", QString("Selected format: %1").arg(format));}// 撤销按钮点击void onUndoClicked() {QMessageBox::information(this, "Undo", "Undo action performed!");undoButton->setEnabled(false); // 撤销后禁用}// 模拟文档变化void simulateDocumentChange() {isDocumentSaved = false;saveButton->setIcon(QIcon(":/images/unsave.png")); // 更新为未保存图标undoButton->setEnabled(true); // 启用撤销按钮}private:QToolButton *saveButton;QToolButton *formatButton;QToolButton *undoButton;bool isDocumentSaved; // 模拟文档保存状态
};int main(int argc, char *argv[]) {QApplication app(argc, argv);// 设置全局样式表app.setStyleSheet("QToolButton {"" border: none;"" padding: 5px;""}""QToolButton:hover {"" background-color: #E0E0E0;""}""QToolButton:menu-indicator {"" width: 10px;"" height: 10px;""}");MainWindow window;window.resize(600, 400);window.show();return app.exec();
}#include "main.moc"
效果:
后续补充...
-
QCheckBox:复选框,支持选中/未选中状态。
-
QRadioButton:单选按钮,用于互斥选择。
-
QComboBox:下拉列表框,支持选择或编辑。
-
QLineEdit:单行文本输入框,支持验证和掩码。
-
QTextEdit:多行文本编辑器,支持富文本。
-
QPlainTextEdit:轻量级纯文本编辑器。
-
QSpinBox:整数输入框,带上下箭头。
-
QDoubleSpinBox:浮点数输入框。
-
QSlider:滑动条,用于选择数值范围。
-
QProgressBar:进度条,显示任务进度。
-
QDial:旋钮控件,用于调整数值。
-
QDateEdit、QTimeEdit、QDateTimeEdit:日期、时间或日期时间输入控件。
-
QCalendarWidget:日历控件,用于选择日期。
-
QGroupBox:分组框,用于组织控件。
-
QFrame:框架控件,支持边框和样式。
-
QTabWidget:选项卡控件,支持多页面切换。
-
QStackedWidget:堆叠控件,用于切换显示单个页面。
-
QToolBox:工具箱控件,类似折叠的选项卡。
二、高级控件(Advanced Widgets)
提供更复杂的功能,适合特定场景。
-
QListWidget:列表控件,支持多选和图标。
-
QTreeWidget:树形控件,显示分层数据。
-
QTableWidget:表格控件,支持单元格编辑。
-
QColumnView:列视图,适合分层数据浏览。
-
QDockWidget:可停靠窗口,支持浮动和拖动。
-
QMdiArea、QMdiSubWindow:多文档界面(MDI)区域和子窗口。
-
QTextBrowser:只读富文本浏览器,支持超链接。
-
QGraphicsView、QGraphicsScene:图形视图框架,用于2D图形和自定义场景(与Widgets结合使用)。
-
QOpenGLWidget:OpenGL渲染窗口,支持3D图形。
三、容器类(Containers)
用于组织和布局其他控件。
-
QWidget:所有控件的基类,提供基本窗口功能。
-
QMainWindow:主窗口类,提供菜单栏、工具栏和状态栏。
-
QDialog:对话框基类,支持模态和非模态。
-
QScrollArea:滚动区域,支持大型内容显示。
-
QSplitter:分割器,允许用户调整子控件大小。
-
QTabBar:选项卡栏,与QTabWidget配合使用。
四、布局管理(Layouts)
用于自动排列控件,适应窗口大小变化。
-
QHBoxLayout:水平布局。
-
QVBoxLayout:垂直布局。
-
QGridLayout:网格布局。
-
QFormLayout:表单布局,适合标签-输入对。
-
QStackedLayout:堆叠布局,显示单一控件。
-
QLayout:布局基类,提供通用布局功能。
五、菜单和工具栏(Menus and Toolbars)
用于创建应用程序的导航和交互功能。
-
QMenu:弹出菜单,支持子菜单和动作。
-
QMenuBar:菜单栏,位于主窗口顶部。
-
QToolBar:工具栏,支持可拖动和浮动。
-
QAction:动作抽象,表示菜单项、工具栏按钮等。
六、对话框(Dialogs)
预定义的对话框,用于常见任务。
-
QMessageBox:消息框,显示提示、警告或错误。
-
QInputDialog:输入对话框,获取用户输入。
-
QFileDialog:文件选择对话框。
-
QColorDialog:颜色选择对话框。
-
QFontDialog:字体选择对话框。
-
QProgressDialog:进度对话框,显示任务进度。
-
QErrorMessage:错误消息对话框,支持重复消息过滤。
七、事件和交互
支持用户交互和事件处理。
-
QEvent:事件基类,用于处理鼠标、键盘等事件。
-
QMouseEvent、QKeyEvent:鼠标和键盘事件。
-
QDrag、QDropEvent:拖放支持。
-
QGestureEvent:手势事件(如触摸设备)。
-
QActionEvent:动作触发事件。
八、样式和主题(Styles and Themes)
用于自定义控件外观。
-
QStyle:控件绘制基类,支持自定义样式。
-
QStyleFactory:创建平台特定样式(如Windows、Fusion)。
-
QStyleSheet:通过CSS-like语法自定义控件外观。
-
QPalette:颜色配置,用于控件主题。
九、其他功能
-
QApplication:应用程序类,管理全局设置和事件循环。
-
QClipboard:剪贴板操作,支持文本、图像等。
-
QDesktopWidget:访问屏幕信息(如分辨率)。
-
QSystemTrayIcon:系统托盘图标支持。
-
QStatusBar:状态栏,显示临时信息。
-
QWhatsThis:上下文帮助功能。
-
QToolTip:工具提示支持。
-
QAccessible:辅助功能支持,增强可访问性。
十、模型/视图支持
虽然主要由Qt Model/View模块处理,但Widgets中包含相关控件:
-
QListView、QTreeView、QTableView:基于模型的视图控件,与QAbstractItemModel配合使用。
十一、动画和效果
-
QPropertyAnimation:属性动画,用于控件动态效果。
-
QGraphicsEffect:图形效果,如阴影、模糊(与QGraphicsView结合)。
十二、国际化支持
-
QTranslator:支持界面多语言翻译。
-
QLocale:本地化支持,处理日期、数字格式等。
相关文章:
Qt Widgets模块功能详细说明,基本控件:QPushButton(二)
一、基本控件(Widgets) Qt 提供了丰富的基本控件,如按钮、标签、文本框、复选框、单选按钮、列表框、组合框、菜单、工具栏等。 1、QPushButton 1.1、概述 (用途、继承关系) QPushButton 是 Qt 框架中用于创建按钮的控件,它的主…...
【MySQL成神之路】MySQL常见命令汇总
目录 MySQL常用命令总结 1. 数据库操作 2. 表操作 3. 数据操作(DML) 4. 索引与优化 5. 用户与权限管理 6. 备份与恢复 7. 事务控制 8. 常用函数 9. 系统状态与日志 总结 MySQL常用命令总结 MySQL作为最流行的关系型数据库之一,提供…...
UnLua源码分析(一)初始化流程
UnLua源码分析(一)初始化流程 接入插件启动注册设置默认参数集注册回调SetActivePostLoadMapWithWorldULuaEnvLocator启动Lua虚拟机初始化UE相关的Lua Lib创建与Lua交互的数据结构注册静态导出的类,函数,枚举Lua层初始化 UUnLuaMa…...
非线性1 修改
第一章为读者介绍了非线性动力学与混沌理论的基本概念、发展历史以及应用领域。 1.1 动力学简史: 从牛顿力学开始,介绍动力学作为物理学分支的发展历程。重点介绍了庞加莱对混沌现象的早期探索,以及20世纪60年代洛伦兹方程的发现࿰…...
系统性能不达标,如何提升用户体验?
当系统性能不达标时,要想有效提升用户体验,必须从性能优化、前后端协同、用户感知改善、监控预警机制四个关键维度切入。其中,性能优化是最直接有效的策略,它通过代码优化、资源压缩、缓存机制、CDN加速等手段,显著提升…...
【Linux】进程的基本概念
目录 概念描述进程-PCB如何查看进程通过系统目录进行查看通过ps指令进行查看 通过系统调用获取进程的PID和PPID(进程标⽰符)通过系统调用创建子进程通过一段代码来介绍fork为什么要有子进程?fork为什么给子进程返回0,给父进程返回子进程的PIDfork函数到底…...
mongodb管理工具的使用
环境: 远程服务器的操作系统:centOS stream 9; mongoDB version:8.0; 本地电脑 navicat premium 17.2 ; 宝塔上安装了mongoDB 目的:通过本地的navicat链接mongoDB,如何打通链接,分2步: 第一步:宝塔-&…...
面试中的线程题
原文链接:线程题大全 Java 并发库同步辅助类 CountDownLatch 工作机制:初始化一个计数器,此计数器的值表示需要等待的事件数量。 提供了两个主要方法: await():当一个线程调用此方法时,它将阻塞&#…...
计算机系统的层次结构
计算机系统的层次结构 一, 计算机系统的层次结构的定义 计算机的一个赢软件组成的综合体. 因为面对的应用范围越来越广, 所以必须有复杂的系统软件和硬件的支持. 软/硬件的设计者和使用者从不同的角度, 不同的语言来对待同一个计算机系统, 因此他们看到的计算机系统的属性对计…...
[特殊字符] SSL/TLS 中的密钥协商流程笔记
✅ 背景说明: SSL/TLS 为了确保通信保密性,结合使用了: 非对称加密(用于密钥交换) 对称加密(用于数据加密) 🔁 客户端主导密钥协商的完整流程如下: 1️⃣ 客户端发起…...
多模态大语言模型arxiv论文略读(八十一)
What is the Visual Cognition Gap between Humans and Multimodal LLMs? ➡️ 论文标题:What is the Visual Cognition Gap between Humans and Multimodal LLMs? ➡️ 论文作者:Xu Cao, Bolin Lai, Wenqian Ye, Yunsheng Ma, Joerg Heintz, Jintai …...
SpringBoot(一)--- Maven基础
目录 前言 一、初始Maven 1.依赖管理 2.项目构建 3.统一项目结构 二、IDEA集成Maven 1.Maven安装 2.创建Maven项目 2.1全局设置 2.2 创建SpringBoot项目 2.3 常见问题 三、单元测试 1.JUnit入门 2.断言 前言 Maven 是一款用于管理和构建Java项目的工具ÿ…...
如何使用WordPress创建美食博客
不管你是否意识到,食物是我们生活的核心。有些人将其用作燃料,而另一些人则将食谱作为一种艺术形式呈现。如果您属于后者,并且想创建一个美食博客来分享您的热情,那么WordPress是一个顶级平台。 几乎每个话题都有一个博客利基&am…...
SAP集团内部公司间交易自动开票
SAP集团内部公司间交易自动开票(非STO/EDI模式) 集团内部公司间采购与销售业务,在确认相应单据无误后,为减少人工开票业务, 可以用系统标准功能来实现自动开票。 1.采购发票自动开票(ERS) T-CODE:BP,勾选“基于收货的发票校验”、“自动G…...
代码审计-php框架开发,实战tp项目,打击微交易,源码获取,扩大战果
实战,不安全写法引发的注入 这个bc靶场源码没有,看老师演示 打开很明显的tp框架源码 拿到tp框架之后第一步,搜索版本信息5.0.5 两个思路 1.代码的不安全写法 2.版本自身存在的漏洞 全局搜索where看看也没有不安全的 哎?&…...
Atcoder Beginner Contest 406
比赛链接:ABC406 A - Not Acceptable 将小时转换成分钟直接进行判断。 时间复杂度: O ( 1 ) O(1) O(1)。 #include <bits/stdc.h> using namespace std;int main() {ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);int a,…...
02 K8s双主安装
00 前提准备 # 设置好主机名并添加hosts解析主机名IP地址身份master01172.2.25.50主Mastermaster02172.2.25.51备Masternode01172.2.25.52节点1node02172.2.25.53节点2node03172.2.25.54节点3 01 使用脚本安装Docker # Docker脚本文件 https://node-siyuan.oss-cn-beijing.a…...
分别用 语言模型雏形N-Gram 和 文本表示BoW词袋 来实现文本情绪分类
语言模型的雏形 N-Gram 和简单文本表示 Bag-of-Words 语言表示模型简介 (1) Bag-of-Words (BoW) 是什么? *定义:将文本表示为词频向量,忽略词序和语法,仅记录每个词的出现次数。 **示例: 句子1:I love …...
2_Spring【IOC容器中获取组件Bean】
Spring中IOC容器中获取组件Bean 实体类 //接口 public interface TestDemo {public void doSomething(); } // 实现类 public class HappyComponent implements TestDemo {public void doSomething() {System.out.println("HappyComponent is doing something...")…...
一次页面假死分析
现象:系统的几个功能若干次切换,页面假死,无反应 上图,不是每次切换都假死,但非常容易重现,每次页面假死都在getValidatorJSONInfo这个调用后 getValidatorJSONInfo调用已返回,但返回内容页面挂…...
WPS多级标题编号以及样式控制
WPS多级标题编号以及样式控制 上一篇:WPS自动生成图表目录以及样式控制 阅读提示:请先阅读完本篇内容再操作,避免出现其他错误。 初始样式: 1.1 步骤演示 说明:以3级目录为例 标题1样式:黑体,…...
方差是什么?
一、方差是什么? 方差(Variance)是概率论和统计学中衡量数据离散程度(即数据与平均值的偏离程度)的核心指标。 通俗理解:方差越大,数据越“分散”“波动大”;方差越小,数据越“集中”“稳定”。 二、方差的公式(以样本数据为例) 计算步骤: 第一步:求平均值 ( …...
Java核心API实战:从字符串到多线程全解析
Java常用API详解与代码实践 一、字符串处理类 1. String类 // 字符串基础操作 String str "Hello,Java!"; System.out.println(str.substring(7)); // 输出"Java!" System.out.println(str.indexOf("Java")); // 输出7// 正则表达式匹配 Str…...
低代码AI开发新趋势:Dify平台化开发实战
在人工智能快速发展的今天,AI应用的开发方式也在不断演变。从传统的手写代码到如今的低代码甚至零代码开发,技术的进步让更多的非专业开发者也能轻松上手。本文将带你走进Dify平台化开发的世界,探索如何通过这一强大的低代码AI开发平台&#…...
基于First Order Motion与TTS的AI虚拟主播系统全流程实现教程
前言:多模态虚拟主播的技术革命 在AI内容生成领域,虚拟主播技术正经历从2D到3D、从固定模板到个性化定制的跨越式发展。本文将深入解析如何通过Python技术栈构建支持形象定制与声音克隆的AI虚拟主播系统,涵盖从人脸建模到多模态融合的全流程…...
中科院自动化研究所通用空中任务无人机!基于大模型的通用任务执行与自主飞行
作者: Ji Zhao and Xiao Lin 单位:中科院自动化研究所 论文标题:General-Purpose Aerial Intelligent Agents Empowered by Large Language Models 论文链接:https://arxiv.org/pdf/2503.08302 主要贡献 硬件-软件协同设计框…...
DOM知识点
DOM(Document Object Model)即文档对象模型,是用于表示和操作HTML、XML文档的编程接口。以下是关于DOM的一些知识点总结: 基本概念 • DOM将文档解析为一个由节点(Node)组成的树形结构,每个节…...
设备预测性维护的停机时间革命:中讯烛龙如何用AI重构工业设备管理范式
在工业4.0的智能化浪潮中,非计划停机每年吞噬企业3%-8%的产值。中讯烛龙预测性维护系统通过多模态感知矩阵分布式智能体的创新架构,实现设备健康管理的范式跃迁,帮助制造企业将停机时间压缩70%以上。本文将深度解析技术实现路径与行业级实践方…...
JMeter 教程:使用 HTTP 请求的参数列表发送 POST 请求(form 表单格式)
目录 ✅ 教程目的 🛠️ 准备工作 📄 操作步骤 第一步:新建测试计划 第二步:添加 HTTP 请求 第三步:添加参数列表(表单参数) 第四步:添加结果查看器 第五步:运行测…...
**HTTP/HTTPS基础** - URL结构(协议、域名、端口、路径、参数、锚点) - 请求方法(GET、POST) - 请求头/响应头 - 状态码含义
# HTTP/HTTPS基础知识点详解 ## 1. URL结构 ### 协议部分 - http:// - 超文本传输协议,明文传输 - https:// - 安全的超文本传输协议,使用SSL/TLS加密 - 爬虫注意点:HTTPS网站有TLS指纹(JA3指纹),可被用于检测爬虫 ### 域名部分…...
2025抓包工具Reqable手机抓包HTTPS亲测简单好用-快速跑通
前言 自安卓7.0高版本系统不在信任用户证书,https抓包方式市面查找方法太过复杂手机要root等,前置条件要求太高太复杂,看的头痛,今天一台电脑按步骤操作完即可抓包https,给大家搞定抓包https问题。支持直接编辑修改请求参…...
大模型在胫骨平台骨折预测及治疗方案制定中的应用研究
目录 一、引言 1.1 研究背景与目的 1.2 国内外研究现状 1.3 研究方法和创新点 二、大模型预测胫骨平台骨折的原理和方法 2.1 相关大模型介绍 2.2 数据收集与预处理 2.3 模型训练与优化 2.4 模型评估指标 三、术前预测与手术方案制定 3.1 骨折类型和严重程度预测 3.…...
AI图像处理之ComfyUI节点(二)
一、Load Checkpoint节点 功能:用于加载预训练的大模型,如Stable Diffusion等 参数: chechkpoint:选择加载的模型文件(.ckpt或.satetensors格式) MODEL:输出用于图像扩散预测的UNet模型 CLIP&…...
异常日志规范
目录 一、错误码 二、异常处理 三、日志规约 一、错误码 强制: 1、错误码的制订原则:快速溯源、沟通标准化。 1)错误码必须能够快速知晓错误来源,可快速判断是谁的问题。 2)错误码必须能够清晰地比对(…...
pycharm连接github(详细步骤)
【前提:菜鸟学习的记录过程,如果有不足之处,还请各位大佬大神们指教(感谢)】 1.先安装git 没有安装git的小伙伴,看上一篇安装git的文章。 安装git,2.49.0版本-CSDN博客 打开cmd(…...
UESplineThicken节点
SplineThicken 函数用来使非常薄的多边形在渲染时显示为略厚。对于线缆、头发、草和其他此类对象,这种效果非常理想。 SplineThicken节点 该节点始终朝向摄像机 可以控制模型前后宽度 可以连接到wpo上制作特效效果 参考链接 https://dev.epicgames.com/document…...
【C++】map和set的使用
📌 个人主页: 孙同学_ 🔧 文章专栏:C 💡 关注我,分享经验,助你少走弯路 文章目录 1. 序列式容器和关联式容器1.1 序列式容器1.2 关联式容器 2. set系列的使用2.1 set和multiset的参考文档2.2 se…...
MCP实战:在扣子空间用扣子工作流MCP,一句话生成儿童故事rap视频
扣子最近迎来重要更新,支持将扣子工作流一键发布成MCP,在扣子空间里使用。 这个功能非常有用,因为我有很多业务工作流是在扣子平台上做的,两者打通之后,就可以在扣子空间里直接通过对话方式调用扣子工作流了࿰…...
c/c++的opencv直方图初识
C/C OpenCV中的图像直方图:零基础入门指南 📊 大家好!今天我们来聊聊图像处理中一个非常基础且重要的概念——直方图(Histogram)。如果你是OpenCV新手,或者对直方图感觉有点迷糊,别担心,这篇文章会用最简单…...
Spring Boot 与 RabbitMQ 的深度集成实践(一)
引言 ** 在当今的分布式系统架构中,随着业务复杂度的不断提升以及系统规模的持续扩张,如何实现系统组件之间高效、可靠的通信成为了关键问题。消息队列作为一种重要的中间件技术,应运而生并发挥着举足轻重的作用。 消息队列的核心价值在于其…...
Android动态音频柱状图可视化解析:从原理到实现
Android动态音频柱状图可视化解析:从原理到实现 一、整体架构设计二、核心组件设计三、核心代码实现四、交互设计与用户体验五、性能优化与问题解决一、整体架构设计 Android动态音频柱状图可视化解析 在移动应用开发中,音频可视化是增强用户体验的重要手段。无论是音乐播放器…...
vue3大事件项目
这周写完了vue3的大事件项目,从中学到了很多东西,并且解決了一部分bug,現在就和大家分享一下我遇到的问题并且是如何解決的 1. QuillEditor 的 v-model 用法错误 先讲一下quilleditor富文本的基本使用方法: 1.安裝quill依賴&am…...
MapReduce-WordCount实现按照value降序排序、字符小写、识别不同标点
要求: 输入文件的按照空格、逗号、点号、双引号等分词 输入文件的大写字母全部换成小写 文件输出要求按照value值降序排序 Hadoop给的wordcount示例代码以及代码理解 基于map reduce的word count个人理解:输入的文件经过map reduce框架处理后&#…...
c++线段树之单点修改区间最大子段和-----P4513 小白逛公园
题目大意 单点修改查询区间最大字段和 解题思路 如果线段树节点存储的是‘区间最大子段和’,如何合并? 简单的加法或求极值都不行,仔细分析可得,父节点最大字段和可能为: 左子树最大子段和右子树最大子段和左子树最…...
[Java实战]Spring Boot整合Elasticsearch(二十六)
[Java实战]Spring Boot整合Elasticsearch(二十六) 摘要:本文通过完整的实战演示,详细讲解如何在Spring Boot项目中整合Elasticsearch,实现数据的存储、检索和复杂查询功能。包含版本适配方案、Spring Data Elasticsea…...
【深度学习新浪潮】大模型在哪些垂域已经有比较好的落地?
AI大模型在多个垂直领域已实现显著落地,以下结合可验证案例与行业数据展开说明: 一、医疗健康:精准诊断与个性化治疗 呼吸系统疾病诊断 国家呼吸医学中心研发的LungDiag模型,基于公开临床数据集训练,在预印本研究中对肺炎、肺癌等10种疾病的辅助诊断准确率达92%。医联Med…...
软件测试全攻略:从概念到实践
目录 测试指南针--概念篇 1. 什么是软件测试? 2. 软件测试和软件开发的关系是什么? 3. 测试需要哪些能力? 4. 测试流程是什么样的? 5. 什么是单元测试和集成测试? 6. 软件的生命周期是什么样的? 需求…...
linux hungtask detect机制分析
1,机制概述 hungtask detect 是 Linux 内核用于检测长时间阻塞("hung")任务的机制,主要针对因死锁、死循环或资源竞争导致无法调度的任务 触发条件:任务在 TASK_UNINTERRUPTIBLE 状态持续超过预设阈值…...
影刀处理 Excel:智能工具带来的高效变革
1. 高效的数据处理能力 1.1 快速读取与写入数据 影刀在处理 Excel 数据时展现出显著的读取与写入速度优势。传统方法处理大型 Excel 文件时,读取速度可能仅为每秒 100 行左右,而影刀通过优化底层代码和采用高效的文件解析算法,读取速度可达…...
2021ICPC四川省赛个人补题ABDHKLM
Dashboard - The 2021 Sichuan Provincial Collegiate Programming Contest - Codeforces 过题难度: A K D M H B L 铜奖 5 594 银奖 6 368 金奖 8 755 codeforces.com/gym/103117/problem/A 模拟出牌的过程,打表即可 // Code Start Here int t…...