• 11209阅读
  • 13回复

QKeyEvent 如何响应三个键的热键组合? [复制链接]

上一主题 下一主题
离线纵刀少年
 

只看楼主 倒序阅读 楼主  发表于: 2014-06-09
就是QWidget类的QKeypressEvent内的QKeyEvent调用问题

QKeyEvent
( Type type, int key, Qt::KeyboardModifiers modifiers, const QString & text = QString(), bool autorep = false, ushort count = 1 )
比如热键是alt+A,则我知道可以判断key是否为A,modifiers是否为alt
但要是ctrl+alt+A呢?试过这样:
if(event->key()==Qt::Key_A&&event->modifiers()==(Qt::AltModifier&Qt::ControlModifier))
但似乎不行呢......
离线roywillow

只看该作者 1楼 发表于: 2014-06-09
Qt::AltModifier&Qt::ControlModifier……
不应该用&运算,应该用|运算吧
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线goldfishxxoo

只看该作者 2楼 发表于: 2014-06-09
少年,试试这样
if(event->key()==Qt::Key_A  &&  event->modifiers()==(Qt::AltModifier | Qt::ControlModifier))
离线纵刀少年

只看该作者 3楼 发表于: 2014-06-09
回 roywillow 的帖子
roywillow:Qt::AltModifier&Qt::ControlModifier……
不应该用&运算,应该用|运算吧 (2014-06-09 19:14) 

噢,对。脑短路了~~~
离线纵刀少年

只看该作者 4楼 发表于: 2014-06-09
回 goldfishxxoo 的帖子
goldfishxxoo:少年,试试这样
if(event->key()==Qt::Key_A  &&  event->modifiers()==(Qt::AltModifier | Qt::ControlModifier)) (2014-06-09 19:15) 

脑短路
离线纵刀少年

只看该作者 5楼 发表于: 2014-06-09
新问题:
现在的Widget有一个输入框lineEdit
程序刚运行的时候焦点就在那输入框上,所以我按如alt+1的快捷键的时候判断1的部分响应不了。必须点击如pushButton的让焦点从lineEdit上消失再能正常响应。
请问有专门针对这种情况解决办法么?(不是要自行把焦点定位到一个无法输入字符的控件上才行吧?)
离线roywillow

只看该作者 6楼 发表于: 2014-06-09
话说你这个不能通过QShortcut来解决吗?
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线纵刀少年

只看该作者 7楼 发表于: 2014-06-09
回 roywillow 的帖子
roywillow:话说你这个不能通过QShortcut来解决吗? (2014-06-09 20:26) 

可以。不过我就差一点点了。难得重写~
离线roywillow

只看该作者 8楼 发表于: 2014-06-09
回 纵刀少年 的帖子
纵刀少年:可以。不过我就差一点点了。难得重写~ (2014-06-09 20:29) 

这玩意的逻辑感觉不是一般的复杂……兄弟保重啊……
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线dbzhang800

只看该作者 9楼 发表于: 2014-06-09
回 纵刀少年 的帖子
纵刀少年:新问题:
现在的Widget有一个输入框lineEdit
程序刚运行的时候焦点就在那输入框上,所以我按如alt+1的快捷键的时候判断1的部分响应不了。必须点击如pushButton的让焦点从lineEdit上消失再能正常响应。
请问有专门针对这种情况解决办法么?(不是要自行把焦点定位到一个无法输入字 .. (2014-06-09 20:10) 

解决方案不就是QShortcut么,几行代码就搞定了。

要么你自己事件过滤器。反正 keyPressEvent 不是用来干这个的(截获其他控件的keyPress事件)
离线纵刀少年

只看该作者 10楼 发表于: 2014-06-09
回 dbzhang800 的帖子
dbzhang800:解决方案不就是QShortcut么,几行代码就搞定了。
要么你自己事件过滤器。反正 keyPressEvent 不是用来干这个的(截获其他控件的keyPress事件) (2014-06-09 20:52) 

那版主大人,现在我要用到8组的 ctrl+alt+数字 作为热键,执行8项基本类似的操作。但Qshortcut只有active()和activatedAmbiguously()信号可用,但它们都没有返回值。这样难道我要把8个操作的函数都单独写出来,然后和对应的shortcut作信号和槽的连接吗?
离线dbzhang800

只看该作者 11楼 发表于: 2014-06-09
你自己都说了,是8个热键。不就是8 个 QShortcut 么?

至于,你是创建8个槽,还是1个槽,这都不是问题。就像是,你有8个QPushButton,但是它的信号clicked()没有返回值,这完全不阻碍你,将其连接到同一个槽,在该槽内针对不同按钮做不同动作。
离线纵刀少年

只看该作者 12楼 发表于: 2014-06-10
回 dbzhang800 的帖子
dbzhang800:你自己都说了,是8个热键。不就是8 个 QShortcut 么?
至于,你是创建8个槽,还是1个槽,这都不是问题。就像是,你有8个QPushButton,但是它的信号clicked()没有返回值,这完全不阻碍你,将其连接到同一个槽,在该槽内针对不同按钮做不同动作。 (2014-06-09 23:40) 

噢,关于你说的思路,今天百度了一下。原来可以用this->sender()->objectName()来判断是哪个信号触发槽的。(之前不知道,以为信号和槽没参数传递就没法判断信号的来源。)
离线dbzhang800

只看该作者 13楼 发表于: 2014-06-10
处理sender()这个函数 外,Qt 中还有专门做这个的类: QSignalMapper


多看看Qt自带的manual和examples 就行了
快速回复
限100 字节
 
上一个 下一个