QT中快捷键的实现

jialiang0601 2013-11-15 11:47:36
环境描述:
1、主对话框MainDialog,包含一个PushButtonA和PushButtonB,点击后弹出子对话框SubDialogA和SubDialogB
2、子对话框SubDialogA,包含一个“响应”,点击后弹出QMessageBoxA
3、子对话框SubDialogB,包含一个“响应”,点击后弹出QMessageBoxB

问题描述:
想实现两个快捷键Ctrl+A和Ctrl+B
在MainDialog下,这两个快捷键都可以响应,分别弹出QMessageBoxA和QMessageBoxB
在SubDialogA中只响应Ctrl+A,弹出QMessageBoxA
在SubDialogB中只响应Ctrl+B,弹出QMessageBoxB

我看了QShortcutContext的几种配置方式,好像没办法实现我这种要求,或者是我没看懂 = =!。

这种要求能否通过事件过滤来实现呢?

请有经验的帮帮忙,给点思路,谢谢了!
...全文
5129 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
艰苦奋斗_Ay 2016-07-05
  • 打赏
  • 举报
回复
引用 14 楼 u010467329 的回复:
[quote=引用 13 楼 w2276190 的回复:] [quote=引用 9 楼 rjsloth 的回复:] 用QAction应该是最简单快捷的方法吧,楼下的代码实现了你的需求。写了一个很简单的主Dialog类,然后一个主函数。
为毛我也是你这么写的快捷键显示出来了但是没用功能呢?能帮我解释一下吗?[/quote] 你是不是忘了写 mainDialog.addAction(actionA);了???[/quote]不是 是忘记写事件啦 已经解决了
mayzz618 2015-11-16
  • 打赏
  • 举报
回复
引用 13 楼 w2276190 的回复:
[quote=引用 9 楼 rjsloth 的回复:] 用QAction应该是最简单快捷的方法吧,楼下的代码实现了你的需求。写了一个很简单的主Dialog类,然后一个主函数。
为毛我也是你这么写的快捷键显示出来了但是没用功能呢?能帮我解释一下吗?[/quote] 你是不是忘了写 mainDialog.addAction(actionA);了???
艰苦奋斗_Ay 2015-11-09
  • 打赏
  • 举报
回复
引用 9 楼 rjsloth 的回复:
用QAction应该是最简单快捷的方法吧,楼下的代码实现了你的需求。写了一个很简单的主Dialog类,然后一个主函数。
为毛我也是你这么写的快捷键显示出来了但是没用功能呢?能帮我解释一下吗?
rjsloth 2013-11-15
  • 打赏
  • 举报
回复
建立一个空Qt工程,添加3个文件,注意文件名,因为有include。然后把对应代码拷到3个文件中,跑一下。
rjsloth 2013-11-15
  • 打赏
  • 举报
回复
// 主Dialog类声明 #include <QDialog> class MainDialog: public QDialog { Q_OBJECT public: MainDialog(QWidget* parent = 0, Qt::WindowFlags f = 0); ~MainDialog(); public slots: void MessageBoxA(); void MessageBoxB(); }; // 主Dialog类实现 #include <QMessageBox> #include "test.h" MainDialog::MainDialog(QWidget *parent, Qt::WindowFlags f): QDialog(parent, f) { } MainDialog::~MainDialog() { } void MainDialog::MessageBoxA() { QMessageBox::about(0, "MessageBoxA", "This is messageBox A"); } void MainDialog::MessageBoxB() { QMessageBox::about(0, "MessageBoxB", "This is messageBox B"); } // 主函数 #include <QApplication> #include <QDialog> #include <QPushButton> #include <QAction> #include "test.h" int main(int argc, char** argv) { QApplication app(argc, argv); QAction* actionA = new QAction(&app); actionA->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_A)); QAction* actionB = new QAction(&app); actionB->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_B)); MainDialog mainDialog; mainDialog.resize(440, 200); mainDialog.addAction(actionA); mainDialog.addAction(actionB); mainDialog.connect(actionA, SIGNAL(triggered()), SLOT(MessageBoxA())); mainDialog.connect(actionB, SIGNAL(triggered()), SLOT(MessageBoxB())); QPushButton* buttonA = new QPushButton("DialogA", &mainDialog); buttonA->resize(100, 40); buttonA->move(80, 80); QPushButton* buttonB = new QPushButton("DialogB", &mainDialog); buttonB->resize(100, 40); buttonB->move(260, 80); QDialog* dialogA = new QDialog(&mainDialog); QPushButton* msgA = new QPushButton("BoxA", dialogA); msgA->resize(100, 40); QDialog* dialogB = new QDialog(&mainDialog); QPushButton* msgB = new QPushButton("BoxB", dialogB); msgB->resize(100, 40); dialogA->connect(buttonA, SIGNAL(clicked()), SLOT(exec())); dialogB->connect(buttonB, SIGNAL(clicked()), SLOT(exec())); dialogA->addAction(actionA); dialogB->addAction(actionB); mainDialog.connect(msgA, SIGNAL(clicked()), SLOT(MessageBoxA())); mainDialog.connect(msgB, SIGNAL(clicked()), SLOT(MessageBoxB())); mainDialog.show(); return app.exec(); }
rjsloth 2013-11-15
  • 打赏
  • 举报
回复
用QAction应该是最简单快捷的方法吧,楼下的代码实现了你的需求。写了一个很简单的主Dialog类,然后一个主函数。
jialiang0601 2013-11-15
  • 打赏
  • 举报
回复
引用 7 楼 u011012932 的回复:
[quote=引用 6 楼 jialiang0601 的回复:] [quote=引用 5 楼 u011012932 的回复:] 事件为keyEvent吧,不是QShortcut事件,判断按下的为Ctrl+A和Ctrl+B就行了!
但是,快捷键是组合键。如果判断 QEvent::KeyPress 的话,每次只要按下一个键,就会触发这个事件了.[/quote] 不是的,你好好看看键盘事件吧! 给你举个例子: //Ctrl+O组合键使用 case Qt::Key_O: if(event->modifiers() & Qt::ControlModifier) { //操作 } [/quote] 哦,我明白你的意思了,也实现了。 但是,用这种结构的话,快捷键或Dialog的数量增加后,这个 eventFilter 的任务就太重了。 我再看看,再理解理解。。看看还有没有其他的办法。。
一去丶二三里 2013-11-15
  • 打赏
  • 举报
回复
引用 6 楼 jialiang0601 的回复:
[quote=引用 5 楼 u011012932 的回复:] 事件为keyEvent吧,不是QShortcut事件,判断按下的为Ctrl+A和Ctrl+B就行了!
但是,快捷键是组合键。如果判断 QEvent::KeyPress 的话,每次只要按下一个键,就会触发这个事件了.[/quote] 不是的,你好好看看键盘事件吧! 给你举个例子: //Ctrl+O组合键使用 case Qt::Key_O: if(event->modifiers() & Qt::ControlModifier) { //操作 }
jialiang0601 2013-11-15
  • 打赏
  • 举报
回复
引用 5 楼 u011012932 的回复:
事件为keyEvent吧,不是QShortcut事件,判断按下的为Ctrl+A和Ctrl+B就行了!
但是,快捷键是组合键。如果判断 QEvent::KeyPress 的话,每次只要按下一个键,就会触发这个事件了.
一去丶二三里 2013-11-15
  • 打赏
  • 举报
回复
事件为keyEvent吧,不是QShortcut事件,判断按下的为Ctrl+A和Ctrl+B就行了!
jialiang0601 2013-11-15
  • 打赏
  • 举报
回复
引用 3 楼 u011012932 的回复:
eventFilter,你查查怎么注册事件!
重载 eventFilter 函数,然后 installEventFilter ,然后在 eventFilter 中处理。 但是,eventFilter可以处理 绑定的 QShortcut 事件吗?
一去丶二三里 2013-11-15
  • 打赏
  • 举报
回复
eventFilter,你查查怎么注册事件!
jialiang0601 2013-11-15
  • 打赏
  • 举报
回复
引用 1 楼 u011012932 的回复:
可以通过事件过滤器来处理,处理键盘事件,发射自定义的信号,来触发相应的动作!
用事件过滤实现的话,那应该在 QObject::eventFilter 还是 QApplication::notify 中实现呢?
一去丶二三里 2013-11-15
  • 打赏
  • 举报
回复
可以通过事件过滤器来处理,处理键盘事件,发射自定义的信号,来触发相应的动作!

16,809

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧