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);

    // 设置中心 widget
    mainWindow.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);

    // 创建一个 QToolButton
    QToolButton *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);

    // 设置中心 widget
    mainWindow.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:本地化支持,处理日期、数字格式等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

旭唐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值