首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Qt和Mac下注册全局热键

在Qt和Mac下注册全局热键
EN

Stack Overflow用户
提问于 2015-11-30 16:37:02
回答 1查看 1.4K关注 0票数 5

在阅读了各种帖子和帖子之后,我需要你的帮助。

我确实有一个用于Mac的Qt应用程序,在某些时候它将处于后台而不是活动状态。在这种情况下,我想添加一个全局热键,这样用户就可以通过单击预定义的热键轻松地打开或关闭某些功能。当应用程序处于后台,并且没有聚焦时,下面的内容不起作用。

代码语言:javascript
复制
QShortcut *shortcut = new QShortcut(QKeySequence(Qt::Key_F12), parent);
shortcut->setContext(Qt::ApplicationShortcut);

到目前为止,我发现Qxt恰好过时于QT5.5。然后是DDHotkey,它需要一个特定的编译器,由于各种原因,我们不能使用它。最后,我找到了添加一个全局AppleScript的解决方案,它再次注册一个事件,而不是我想要的。

代码语言:javascript
复制
tell application "System Events" to tell process "myApp"
    click menu item "myButton" of menu 1 of menu bar item "Menu" of menu bar 1
end tell

是否有一种方法可以使用objective-ccocoa来完成我想要的任务?如果我可能漏掉了什么东西,请把我引向正确的方向。

提前感谢!

对于那些寻求更多Qt方式的人,请查看以下存储库:https://github.com/ddqd/qxtglobalshortcut5

它利用了过时的qxt库,但使它再次工作。这个人测试了它直到QT5.4,我们在QT5.5下成功地使用了它。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-30 17:01:07

这可能就是你要找的https://github.com/jaz303/JFHotkeyManager

您还可以从Apple中查看这个示例,使用RegisterEventHotKey API调用,我认为它将为您指明正确的方向。8

或者你可以试试这段代码

代码语言:javascript
复制
#import <Carbon/Carbon.h>

EventHandlerUPP hotKeyFunction;

pascal OSStatus hotKeyHandler(EventHandlerCallRef nextHandler,EventRef theEvent, void *userData)
{    
    Notify *obj =  userData;
    [obj foo];    
    return noErr;
}

@implementation Notify

- (id)init
{
    self = [super init];
    if (self) {
        //handler
        hotKeyFunction = NewEventHandlerUPP(hotKeyHandler);
        EventTypeSpec eventType;
        eventType.eventClass = kEventClassKeyboard;
        eventType.eventKind = kEventHotKeyReleased;
        InstallApplicationEventHandler(hotKeyFunction,1,&eventType,self,NULL);
        //hotkey
        UInt32 keyCode = 80; //F19    
        EventHotKeyRef theRef = NULL;
        EventHotKeyID keyID;
        keyID.signature = 'FOO '; //arbitrary string
        keyID.id = 1;
        RegisterEventHotKey(keyCode,0,keyID,GetApplicationEventTarget(),0,&theRef);

    }        
    return self;
}

- (void)foo
{

}

@end

和标题

代码语言:javascript
复制
#include "notify.mm"
@interface Notify
 - (id)init;
 - (void)foo;
@end

简单地说,这只是一个带有方法和构造函数的对象,在object中,这被称为init,或初始化和变体。用“新”来称呼它应该是直接的。

E.x

代码语言:javascript
复制
#include "notify.h"
int main(){
  Notify* object = new Notify();
}

然而,需要对目标C有一些基本的理解。在我看来,这主要是语法上的差异。但我自己也不是客观的专家。无论如何,有很多方法来解决它,这可能不是最好的主意。您还可以从您的C++类内部调用Objective代码。看看下面的链接,看看是如何做到的一个很好的例子。

https://el-tramo.be/blog/mixing-cocoa-and-qt/

https://github.com/remko/mixing-cocoa-and-qt/

http://philjordan.eu/article/mixing-objective-c-c++-and-objective-c++

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34003450

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档