QT之快捷键
它可以捕捉某个特定键盘组合,并触发你定义的行为(通常是一个槽函数)是 Qt 提供的类,用于。
·

文章目录
✅ 一、QShortcut 是什么?
QShortcut 是 Qt 提供的类,用于给窗口部件添加快捷键操作,比如 Ctrl+S 保存,Ctrl+O 打开文件等。
它可以捕捉某个特定键盘组合,并触发你定义的行为(通常是一个槽函数)
🍃二、基本语法和用法
QShortcut *shortcut = new QShortcut(QKeySequence("Ctrl+O"), this);
connect(shortcut, &QShortcut::activated, this, &YourClass::onOpenFile);
QKeySequence("Ctrl+O"):定义快捷键this:指向父控件,通常是窗口类activated:信号,在快捷键按下时发射onOpenFile:你定义的槽函数(执行逻辑)
🦴 三、构造函数
QShortcut(const QKeySequence &key, QWidget *parent,
const char *member = nullptr,
const char *ambiguousMember = nullptr,
Qt::ShortcutContext context = Qt::WindowShortcut);
key:快捷键(如 “Ctrl+S”)parent:哪个控件监听这个快捷键(必须是 QWidget)member:早期信号绑定方式,现在已弃用,推荐用connect()context:快捷键作用范围(默认是窗口范围)
🥴 四、常用成员函数
| 函数名 | 说明 |
|---|---|
setKey(QKeySequence) |
设置快捷键 |
key() |
获取当前快捷键 |
setEnabled(bool) |
启用或禁用快捷键 |
isEnabled() |
是否启用 |
setContext(Qt::ShortcutContext) |
设置作用范围 |
context() |
获取当前作用范围 |
🧩 五、信号
| 信号名 | 说明 |
|---|---|
activated() |
当快捷键被正确触发时发出 |
activatedAmbiguously() |
有多个快捷键冲突时触发 |
🎮 六、ShortcutContext 快捷键上下文解释
enum Qt::ShortcutContext {
Qt::WindowShortcut, // 默认,只在当前窗口有效
Qt::ApplicationShortcut, // 整个应用程序中都有效
Qt::WidgetShortcut, // 仅当前控件有效
Qt::WidgetWithChildrenShortcut // 当前控件及其子控件中有效
};
例如:
shortcut->setContext(Qt::ApplicationShortcut);
📋 七、完整示例
#include "widget.h"
#include <QApplication>
#include <QMessageBox>
#include <QShortcut>
#include <QObject>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
QShortcut *shortcut = new QShortcut(QKeySequence("Ctrl+Q"), &w);
shortcut->setContext(Qt::WindowShortcut); // 可选
QObject::connect(shortcut, &QShortcut::activated, &w, [=]() {
QMessageBox::information(nullptr, "提示", "你按下了 Ctrl+Q");
});
return a.exec();
}
⚠️ 注意事项
- 父对象必须是
QWidget或其子类。 - 快捷键不要和系统默认冲突(如 Ctrl+C、Ctrl+Alt+Del)。
- 不能绑定到
QMainWindow::centralWidget()以外的窗口中时要特别小心作用范围。 - Qt Designer 中也可以通过“动作”系统给按钮或菜单加快捷键。
📚 小结
| 功能 | QShortcut 做什么 |
|---|---|
| 快捷键触发 | 捕获键盘组合如 Ctrl+S |
| 自动发信号 | 快捷键触发自动执行某个函数 |
| 跨平台兼容 | 自动适配 Mac / Windows / Linux |
| 支持作用域控制 | 控制在哪些控件中生效 |
更多推荐



所有评论(0)