Qt控件:点击控件

1. QAction

1. 1简介与API

QAction 是一个核心类,用于表示应用程序中的一个操作(如菜单项、工具栏按钮或快捷键触发的功能)。它将操作的逻辑与 UI 表现分离,使代码更易于维护和扩展。

核心功能

  1. 统一操作逻辑:一个 QAction 可同时关联到菜单、工具栏和快捷键,避免代码重复。
  2. 状态管理:支持启用 / 禁用、选中 / 未选中(如复选框菜单项)等状态。
  3. 图标与文本:可设置图标、文本、工具提示等 UI 属性。
  4. 信号与槽:通过 triggered() 信号触发操作。

API

常用构造函数

QAction(const QString &text, QObject *parent = nullptr);
QAction(const QIcon &icon, const QString &text, QObject *parent = nullptr);

设置属性

setText(const QString &text):设置显示文本。
setIcon(const QIcon &icon):设置图标。
setToolTip(const QString &tip):设置工具提示。
setShortcut(const QKeySequence &shortcut):设置快捷键。
setCheckable(bool checkable):设置是否可勾选(如复选框菜单项)。
setChecked(bool checked):设置勾选状态。
setEnabled(bool enabled):启用 / 禁用操作。

获取属性

text():获取显示文本。
icon():获取图标。
shortcut():获取快捷键。
isChecked():判断是否被勾选。
isEnabled():判断是否启用。

信号

triggered(bool checked = false):操作被触发时发出(如点击菜单项)。
toggled(bool checked):状态切换时发出(仅在 checkable 为 true 时)。

1.2 实例

应用情况

创建可勾选的动作(如工具栏按钮)

QAction *toggleToolbarAction = new QAction("Show Toolbar", this);
toggleToolbarAction->setCheckable(true);
toggleToolbarAction->setChecked(true);  // 默认显示

connect(toggleToolbarAction, &QAction::toggled, [=](bool checked) {
    toolbar->setVisible(checked);
});

使用标准动作(如复制、粘贴)

// 使用 Qt 预定义的标准动作
QAction *copyAction = new QAction(QIcon::fromTheme("edit-copy"), "Copy", this);
copyAction->setShortcut(QKeySequence::Copy);  // 自动适配平台(Ctrl+C 或 Command+C)
connect(copyAction, &QAction::triggered, textEdit, &QTextEdit::copy);

应用场景

//菜单
QMenu *fileMenu = menuBar()->addMenu("File");
fileMenu->addAction(openAction);
fileMenu->addAction(saveAction);
fileMenu->addSeparator();  // 添加分隔线
fileMenu->addAction(exitAction);

//工具栏
QToolBar *toolbar = addToolBar("Main Toolbar");
toolbar->addAction(openAction);
toolbar->addAction(saveAction);

//快捷键
saveAction->setShortcut(QKeySequence("Ctrl+S"));
// 或使用标准快捷键
saveAction->setShortcut(QKeySequence::Save);

Qt 提供了许多预定义的标准快捷键,常见的包括:

常量描述Windows/LinuxmacOS
QKeySequence::Open打开文件Ctrl+OCommand+O
QKeySequence::Save保存文件Ctrl+SCommand+S
QKeySequence::Copy复制Ctrl+CCommand+C
QKeySequence::Paste粘贴Ctrl+VCommand+V
QKeySequence::Cut剪切Ctrl+XCommand+X
QKeySequence::Undo撤销Ctrl+ZCommand+Z
QKeySequence::Redo重做Ctrl+YCommand+Shift+Z
QKeySequence::Find查找Ctrl+FCommand+F
QKeySequence::Quit退出应用Ctrl+QCommand+Q

1.3 QAction与QPushButton/QToolButton关系

在 Qt 框架中,QAction、QPushButton 和 QToolButton 都是用于用户交互的组件,但它们的角色和设计模式有所不同。

QAction

QAction 是一个抽象的用户交互操作,代表一个可执行的动作(如 “保存”“复制”“退出”)。

  • 特点:
  1. 不直接显示在界面上,而是通过其他控件(如菜单、工具栏、按钮)触发。
  2. 封装了动作的属性(如文本、图标、快捷键、状态)和回调(槽函数)。
  3. 支持状态管理(如可勾选、可禁用)。

QPushButton

QPushButton 是一个可见的按钮控件,用于触发单次操作。

  • 特点:
  1. 直接显示在界面上,用户可点击。
  2. 通常与特定位置绑定(如对话框、表单)。

QToolButton

QToolButton 是一种轻量级按钮,常用于工具栏。

  • 特点:
  1. 设计更简洁,通常只显示图标(可搭配文本)。
  2. 支持下拉菜单(如组合按钮)。

三者关系

  1. QAction 是核心逻辑的载体:
    定义动作的行为(如点击后执行的函数)和属性(如图标、文本)。
    可被多个控件共享(如同时出现在菜单和工具栏)。
  2. QPushButton/QToolButton 是 QAction 的可视化载体:
    一个 QAction 可关联到多个 QPushButton 或 QToolButton。
    按钮自动继承 QAction 的属性(如文本、图标、启用状态)。
#include <QMainWindow>
#include <QAction>
#include <QPushButton>
#include <QToolButton>
#include <QToolBar>

class MainWindow : public QMainWindow {
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr) : QMainWindow(parent) {
        // 创建动作
        QAction *saveAction = new QAction("保存", this);
        saveAction->setIcon(QIcon(":/icons/save.png"));
        saveAction->setShortcut(Qt::CTRL + Qt::Key_S);
        connect(saveAction, &QAction::triggered, this, &MainWindow::saveFile);

        // 关联到普通按钮
        QPushButton *pushButton = new QPushButton("保存", this);
        pushButton->setDefaultAction(saveAction);

        // 关联到工具栏按钮
        QToolBar *toolBar = addToolBar("工具栏");
        toolBar->addAction(saveAction);  // 自动创建QToolButton

        // 手动创建QToolButton并关联动作
        QToolButton *toolButton = new QToolButton(this);
        toolButton->setDefaultAction(saveAction);
    }

private slots:
    void saveFile() {
        // 保存文件的逻辑
    }
};
控件适用场景示例
QAction抽象定义操作,需在多处复用菜单项、工具栏按钮、快捷键
QPushButton独立的、强调的操作按钮对话框中的 “确定”“取消” 按钮
QToolButton工具栏中的轻量级按钮,常配合图标使用编辑器中的 “复制”“粘贴” 按钮

2. QMenu

在Qt中,QMenu 是用于创建上下文菜单、下拉菜单或弹出菜单的控件,支持多级子菜单、图标、分隔线等功能。

  • QMenu:菜单容器,可包含菜单项(QAction)和子菜单。
  • QAction:菜单项,可包含文本、图标、快捷键等属性。
  • 信号:菜单项被点击时发出 triggered() 信号。

2.1 创建和使用 QMenu

方法1:在Qt Designer中添加

  1. 在Qt Designer中拖入一个 QPushButtonQToolButton
  2. 右键点击按钮,选择"Change objectName"设置名称(如 menuButton)。
  3. 在代码中关联菜单:
    QMenu *menu = new QMenu(this);
    menu->addAction("选项1");
    menu->addAction("选项2");
    ui->menuButton->setMenu(menu);  // 关联按钮和菜单
    

方法2:在代码中创建

#include <QMenu>
#include <QAction>

// 创建主菜单
QMenu *menu = new QMenu("文件", this);  // 标题仅对下拉菜单有效

// 添加菜单项
QAction *openAction = menu->addAction("打开");
QAction *saveAction = menu->addAction("保存");

// 添加分隔线
menu->addSeparator();

// 添加子菜单
QMenu *exportMenu = menu->addMenu("导出");
exportMenu->addAction("导出为PDF");
exportMenu->addAction("导出为Excel");

// 显示菜单(在鼠标位置弹出)
menu->popup(QCursor::pos());

2.2 常用方法和属性

QMenu 方法

// 添加菜单项
QAction* addAction(const QString &text);
QAction* addAction(const QIcon &icon, const QString &text);

// 添加子菜单
QMenu* addMenu(const QString &title);
QMenu* addMenu(const QIcon &icon, const QString &title);

// 添加分隔线
QAction* addSeparator();

// 设置和获取标题
void setTitle(const QString &title);
QString title() const;

// 弹出菜单
void popup(const QPoint &pos);  // 在指定位置弹出
void exec(const QPoint &pos);   // 模态弹出,阻塞直到菜单关闭

// 添加自定义控件
void addWidget(QWidget *widget);  // 添加任意控件(如QSpinBox)

QAction 常用属性

属性说明
text菜单项文本
icon菜单项图标
shortcut快捷键(如 Ctrl+O
checkable是否可勾选
checked勾选状态(对可勾选菜单项有效)
enabled是否启用
visible是否可见

** 信号与槽连接**
QMenu和QAction提供多种信号,常用的有:

// QAction 信号
void triggered(bool checked = false);  // 菜单项被点击
void toggled(bool checked);            // 可勾选菜单项状态变化

// QMenu 信号
void aboutToShow();    // 菜单即将显示
void aboutToHide();    // 菜单即将隐藏
void triggered(QAction *action);  // 任意菜单项被点击

示例:连接信号与槽

// 方式1:直接连接QAction的triggered信号
connect(openAction, &QAction::triggered, this, &MyClass::openFile);

// 方式2:通过QMenu的triggered信号获取被点击的action
connect(menu, &QMenu::triggered, [=](QAction *action) {
    if (action == openAction) {
        openFile();
    } else if (action == saveAction) {
        saveFile();
    }
});

// 方式3:处理可勾选菜单项
QAction *autoSaveAction = menu->addAction("自动保存");
autoSaveAction->setCheckable(true);
connect(autoSaveAction, &QAction::toggled, [=](bool checked) {
    setAutoSave(checked);
});

2.3 创建上下文菜单(右键菜单)

// 为widget设置上下文菜单策略
widget->setContextMenuPolicy(Qt::CustomContextMenu);

// 连接自定义上下文菜单信号
connect(widget, &QWidget::customContextMenuRequested,
        this, &MyClass::showContextMenu);

// 实现上下文菜单显示函数
void MyClass::showContextMenu(const QPoint &pos) {
    QMenu menu(this);
    menu.addAction("复制");
    menu.addAction("粘贴");
    menu.addSeparator();
    menu.addAction("删除");
    
    // 转换为全局坐标
    QPoint globalPos = widget->mapToGlobal(pos);
    menu.exec(globalPos);  // 模态显示菜单
}

2.4 注意事项

  • 菜单项所有权:通过 addAction() 添加的菜单项由QMenu管理,无需手动删除。
  • 模态与非模态exec() 是模态调用,会阻塞直到菜单关闭;popup() 是非模态的。
  • 性能考虑:动态生成大量菜单项时,建议使用 aboutToShow 信号延迟创建。
  • 跨平台一致性:不同平台的菜单样式可能略有差异,可通过Style Sheets统一外观。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值