求教自定义控件自定义快捷键思路

幻夢之葉 2019-09-22 01:16:28
需求描述:
控件是继承QWidget,通过自绘实现的按钮,现在需要增加快捷键功能(用户可自定义)
先说下鼠标的操作:
鼠标按下和谈起,会发生一个或两个操作,这里假设为A操作和B操作(依照给定的模式)
1)鼠标按下发生A操作
2)鼠标按下发生A操作,延时后发生B操作
3)鼠标按下发生A操作,鼠标弹起发生B操作

我曾经考虑过几种实现方式,这里谈谈各自遇到的问题:
① 依照Qt按钮的实现方式(经过实际测试)
存在的问题:可以正常获取到快捷键按键事件,但是实现不了3)提到的点,即当快捷键按键取消我获取不到消息来调用B操作

② 重载按键按下和按键弹起事件
存在的问题:因为快捷键是用户定义的,按键数量和按键值不可预测,造成判断困难。
另外不清楚该如何实现抓取范围,官方快捷键可以设定抓取范围:例如应用程序级别,窗口级别,部件级别等

③ 自定义控件携带一个QAction,只需要要连接该QAction的信号
存在的问题:与①中所存在的问题一致

目前很尴尬地陷在此处
想求教下各位大神有没有解决上诉三种方式任何一种中存在的问题的方法?
或者提供新的解决方案,感激不尽。

此处重金求子!!!!
噢~,不对,重分求解

...全文
277 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
弓人水 2019-09-25
  • 打赏
  • 举报
回复
嗯,QAbstractButton的源码确实是快捷键按下触发、长按触发,无抬起快捷键的信号。

那只能继承QGUIApplication,重写notify方法,再新增一个快捷键抬起的事件了。

看下Qt源码,你就有思路了。

switch (e->type()) {
case QEvent::KeyPress: {
QKeyEvent* keyEvent = static_cast<QKeyEvent*>(e);
const int key = keyEvent->key();
// When a key press is received which is not spontaneous then it needs to
// be manually sent as a shortcut override event to ensure that any
// matching shortcut is triggered first. This enables emulation/playback
// of recorded events to still have the same effect.
if (!e->spontaneous() && receiver->isWidgetType()) {
if (qt_sendShortcutOverrideEvent(qobject_cast<QWidget *>(receiver), keyEvent->timestamp(),
key, keyEvent->modifiers(), keyEvent->text(),
keyEvent->isAutoRepeat(), keyEvent->count()))
return true;
}
qt_in_tab_key_event = (key == Qt::Key_Backtab
|| key == Qt::Key_Tab
|| key == Qt::Key_Left
|| key == Qt::Key_Up
|| key == Qt::Key_Right
|| key == Qt::Key_Down);
}
default:
break;
}
幻夢之葉 2019-09-25
  • 打赏
  • 举报
回复
引用 4 楼 弓人水 的回复:
PushButton绑定快捷键,按下快捷键触发pressed,抬起快捷键触发released,不能满足吗?
能更加详细说说这个吗? 我了解到PushButton按钮也只是快捷键按下才触发,快捷键也支持长按重复。 按理说我是可以用个定时器判断是否取消了长按,但是很尴尬的是,系统要求实时,多出几百毫秒的延迟有点难接受
幻夢之葉 2019-09-25
  • 打赏
  • 举报
回复
引用 6 楼 弓人水 的回复:
嗯,QAbstractButton的源码确实是快捷键按下触发、长按触发,无抬起快捷键的信号。 那只能继承QGUIApplication,重写notify方法,再新增一个快捷键抬起的事件了。 看下Qt源码,你就有思路了。

    switch (e->type()) {
        case QEvent::KeyPress: {
            QKeyEvent* keyEvent = static_cast<QKeyEvent*>(e);
            const int key = keyEvent->key();
            // When a key press is received which is not spontaneous then it needs to
            // be manually sent as a shortcut override event to ensure that any
            // matching shortcut is triggered first. This enables emulation/playback
            // of recorded events to still have the same effect.
            if (!e->spontaneous() && receiver->isWidgetType()) {
                if (qt_sendShortcutOverrideEvent(qobject_cast<QWidget *>(receiver), keyEvent->timestamp(),
                                                 key, keyEvent->modifiers(), keyEvent->text(),
                                                 keyEvent->isAutoRepeat(), keyEvent->count()))
                    return true;
            }
            qt_in_tab_key_event = (key == Qt::Key_Backtab
                        || key == Qt::Key_Tab
                        || key == Qt::Key_Left
                        || key == Qt::Key_Up
                        || key == Qt::Key_Right
                        || key == Qt::Key_Down);
        }
        default:
            break;
    }
好的,万分感谢。
弓人水 2019-09-24
  • 打赏
  • 举报
回复
PushButton绑定快捷键,按下快捷键触发pressed,抬起快捷键触发released,不能满足吗?

其他QAction、QShorcut的情况,因为qapplication的源码里面就是在pressed的时候分发快捷键,所以一般情况下快捷键只存在按下的时候触发信号,抬起的时候并没有对应的快捷键抓取接口。

而且,这种快捷键抬起触发操作的需求比较特殊,估计需要实现一套快捷键机制,不使用Qt自带的。
非要用Qt的快捷键的话,那么需要自己在监听键盘的release事件,然后跟快捷键的事件形成一个是非状态机。
donwmufromdying 2019-09-23
  • 打赏
  • 举报
回复
你自己画的按钮,需要自定义信号,如果你的按钮不是从QPushButton或者QAbstractButton继承,那么你得从QWidget继承。然后需要重写一些按键相关的event.当按键事件时发生的position在你画的按钮内则emit你自定义的click信号
弓人水 2019-09-23
  • 打赏
  • 举报
回复
PushButton绑定快捷键,可以触发Button的pressed和released信号。
幻夢之葉 2019-09-23
  • 打赏
  • 举报
回复
引用 1 楼 弓人水 的回复:
PushButton绑定快捷键,可以触发Button的pressed和released信号。
引用 2 楼 donwmufromdying 的回复:
你自己画的按钮,需要自定义信号,如果你的按钮不是从QPushButton或者QAbstractButton继承,那么你得从QWidget继承。然后需要重写一些按键相关的event.当按键事件时发生的position在你画的按钮内则emit你自定义的click信号
现在不是鼠标按键的问题,是鼠标已经实现。 我想用快捷键实现鼠标相同的效果,即: 快捷键按下与快捷键释放。 1)参照QAbstractButton快捷键的实现,只能截取到快捷键按下,松开按键没法判断 2)重载按键事件,一个是快捷键用户设定(按键值和按键数量)有点不好跟按键比较;另外抓取的范围也不清楚怎么弄

16,816

社区成员

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

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