Qt - 在 Windows 上按下 Alt 后防止菜单栏抓住焦点

Posted

技术标签:

【中文标题】Qt - 在 Windows 上按下 Alt 后防止菜单栏抓住焦点【英文标题】:Qt - Prevent menubar from grabbing focus after Alt pressed on Windows 【发布时间】:2016-05-04 07:21:01 【问题描述】:

在我的应用程序中,一旦按下Alt 键,我需要更改鼠标光标并执行一些不同的操作,并在释放Alt 键后返回正常光标和正常行为。

在 Mac OS 上一切正常,而 Alt-pressing 事件将焦点移动到 Windows 上的菜单栏(本机 Windows 行为),这导致了我想要改变光标的意外行为。

所以问题是:如何禁用此 Windows 功能(当然是 Qt 中的代码)并始终将Alt 按键事件传递给应用程序本身而不是菜单栏。

【问题讨论】:

FTR,我在这个问题上reported a bug,关于按下 Alt 键后焦点卡在菜单中。 【参考方案1】:

SH_MenuBar_AltKeyNavigation 样式提示负责按下 Alt 后的菜单栏选择。您需要继承 QProxyStyle 并覆盖 styleHint 方法,如下所示:

class MenuStyle : public QProxyStyle

public:
    int styleHint(StyleHint stylehint, const QStyleOption *opt, const QWidget *widget, QStyleHintReturn *returnData) const
    
        if (stylehint == QStyle::SH_MenuBar_AltKeyNavigation)
            return 0;

        return QProxyStyle::styleHint(stylehint, opt, widget, returnData);
    
;

然后,将自定义样式设置为应用程序。

QApplication a(argc, argv);
a.setStyle(new MenuStyle());

【讨论】:

非常感谢!它帮助解决了这个问题。很好记。

以上是关于Qt - 在 Windows 上按下 Alt 后防止菜单栏抓住焦点的主要内容,如果未能解决你的问题,请参考以下文章

如何设置qt creator的快捷键

如何将 Qt 按钮映射到键盘按键

Qt程序使用QtitanRibbon库的RibbonPage的Alt键

如何使用 Ruby 检测在 Windows 平台上是不是按下了 SHIFT 或 ALT 键?

使用 jQuery 在初始 .mousedown() 事件后防止后续触发

在父活动上按下后退按钮