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



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

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

我尝试在我的主窗口中安装事件过滤器,但是快捷方式仍然处于激活状态(尽管甚至为每个事件类型返回 true(。

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

我还检查按键释放事件的原因是仅在没有按住键盘修饰符时重新启用快捷键(这样,如果您在键盘键之前释放鼠标按钮,您不会意外触发快捷键(

快捷方式默认为Qt::WindowShortcut,这意味着它们可以在窗口中的任何位置激活。当鼠标按钮在视口上向下时,我暂时将其切换到Qt::WidgetShortcut,这仅意味着如果小部件收到快捷方式,则可以激活它们(但不是视口小部件,它是我的主窗口的子窗口(。这是禁用/重新启用它们的更好选择,因为我不必修改保存禁用状态以及工具栏按钮变为灰色。

主窗口类

class StageEditorWindow : public QMainWindow {
Q_OBJECT
friend class ViewportEventFilter;
protected:
/**
* @brief Checks if any mouse buttons are down and disables/enables shortcuts appropriately
*/
void checkShortcutsEnabled() {
QList<QAction*> actions = findChildren<QAction*>();
if (QApplication::mouseButtons() != Qt::NoButton) {
for (QAction *a : actions) a->setShortcutContext(Qt::WidgetShortcut);
} else if (QApplication::keyboardModifiers() == Qt::NoModifier) {
//Don't re-enable shortcuts until modifers have been released
for (QAction *a : actions) a->setShortcutContext(Qt::WindowShortcut);
}
}
//Don't forget to install the event filter in your constructor
};

事件筛选器类

/**
* @brief Used to check if the mouse is pressed over the viewport and disable shortcuts if so
*/
class ViewportEventFilter : public QObject {
Q_OBJECT
private:
StageEditorWindow *w;
public:
ViewportEventFilter(StageEditorWindow *w, QObject *parent = nullptr) :
QObject(parent),
w(w) {}
protected:
bool eventFilter(QObject *watched, QEvent *event) {
if (event->type() == QEvent::MouseButtonPress ||
event->type() == QEvent::MouseButtonRelease ||
event->type() == QEvent::KeyRelease) {
w->checkShortcutsEnabled();
}
return QObject::eventFilter(watched, event);
}
};

最新更新