Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt-禁用/启用所有快捷方式_Qt_Events_Input_Keyboard Shortcuts_Disabled Input - Fatal编程技术网

Qt-禁用/启用所有快捷方式

Qt-禁用/启用所有快捷方式,qt,events,input,keyboard-shortcuts,disabled-input,Qt,Events,Input,Keyboard Shortcuts,Disabled Input,我有一个带有3D视口的Qt5应用程序,用户可以在按住RClick并使用WASDQE时四处导航。我想这样做,按住Ctrl键会减慢相机的移动速度,但这样做会激活快捷方式 是否可以禁用和启用所有快捷方式,以便在鼠标按钮按下时禁用它们 我曾尝试在主窗口上安装事件过滤器,但快捷方式仍处于激活状态(尽管每个事件类型都返回true)。我最终为我的3D视口小部件创建了一个事件过滤器,以检查是否按下鼠标。每次遇到这些事件(以及按键释放事件),我都会在主窗口上调用一个函数(checkShortcutsEnabled

我有一个带有3D视口的Qt5应用程序,用户可以在按住RClick并使用WASDQE时四处导航。我想这样做,按住Ctrl键会减慢相机的移动速度,但这样做会激活快捷方式

是否可以禁用和启用所有快捷方式,以便在鼠标按钮按下时禁用它们


我曾尝试在主窗口上安装事件过滤器,但快捷方式仍处于激活状态(尽管每个事件类型都返回true)。

我最终为我的3D视口小部件创建了一个事件过滤器,以检查是否按下鼠标。每次遇到这些事件(以及按键释放事件),我都会在主窗口上调用一个函数(
checkShortcutsEnabled()
),根据是否未按下按钮来切换快捷方式内容

我还检查按键释放事件的原因是,只有在没有按下键盘修改器的情况下才重新启用快捷键(这样,如果在键盘按键之前释放鼠标按钮,就不会意外绊倒快捷键)

快捷方式默认为
Qt::WindowShortcut
,这意味着可以在窗口中的任何位置激活快捷方式。当鼠标按钮在视口上按下时,我会临时切换到
Qt::WidgetShortcut
,这意味着只有当小部件接收到快捷方式(但不是视口小部件,它是我主窗口的子窗口)时,它们才能被激活。这是一个比禁用/重新启用它们更好的替代方法,因为我不必在保存禁用状态以及工具栏按钮变灰的问题上做手脚

主窗口类

class StageEditor窗口:公共QMainWindow{
Q_对象
好友类ViewportEventFilter;
受保护的:
/**
*@brief检查是否有任何鼠标按钮已按下,并相应地禁用/启用快捷方式
*/
void checkShortcutsEnabled(){
QList actions=findChildren();
if(QApplication::mouseButtons()!=Qt::NoButton){
对于(QAction*a:actions)a->setShortcutContext(Qt::WidgetShortcut);
}else if(QApplication::keyboardModifiers()==Qt::NoModifier){
//在释放修改器之前不要重新启用快捷方式
对于(QAction*a:actions)a->setShortcutContext(Qt::WindowsShortCut);
}
}
//不要忘记在构造函数中安装事件过滤器
};
事件筛选器类

/**
*@brief用于检查鼠标是否按在视口上,如果是,则禁用快捷方式
*/
类ViewportEventFilter:公共QObject{
Q_对象
私人:
StageEditor窗口*w;
公众:
ViewportEventFilter(StageEditorWindow*w,QObject*parent=nullptr):
QObject(父对象),
w(w){}
受保护的:
bool事件过滤器(QObject*监视,QEvent*事件){
如果(事件->类型()==QEvent::MouseButtonPress||
事件->类型()==QEvent::MouseButtonRelease||
事件->类型()==QEvent::KeyRelease){
w->checkShortcutsEnabled();
}
返回QObject::eventFilter(监视的,事件);
}
};