2015-11-30 72 views
3

通過閱讀各種帖子和線程,導致我沒有我需要你的幫助。在Qt和Mac OS X下注冊全局熱鍵

我確實有一個適用於Mac OS X的Qt應用程序,它在某些使用點將在後臺運行而不是活動的。在這種情況下,我想要添加全局熱鍵,以便用戶可以通過單擊預定義的熱鍵輕鬆地打開或關閉某些功能。 當應用程序處於後臺並且未聚焦時,以下功能無法正常工作。

QShortcut *shortcut = new QShortcut(QKeySequence(Qt::Key_F12), parent); 
shortcut->setContext(Qt::ApplicationShortcut); 

到目前爲止,我發現Qxt這恰好是過時的Qt的5.5。 然後有DDHotkey需要一個不能使用的特定編譯器。 最後,我發現添加一個全局的AppleScript的解決方案,它再次註冊一個事件,而不是我正在尋找的。

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庫,但得到它再次合作。 這個人測試它直到Qt 5.4,我們在Qt 5.5下成功使用它。

回答

3

這可能是你正在尋找 https://github.com/jaz303/JFHotkeyManager

您還可以看看蘋果這個例子裏,使用RegisterEventHotKey API調用,我認爲將指向您在正確的方向。 https://developer.apple.com/library/prerelease/mac/samplecode/FunkyOverlayWindow/Listings/FunkyOverlayWindow_OverlayWindow_m.html#//apple_ref/doc/uid/DTS10000391-FunkyOverlayWindow_OverlayWindow_m-DontLinkElementID_8

或者你可以試試這個代碼

#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 

和標題

#include "notify.mm" 
@interface Notify 
- (id)init; 
- (void)foo; 
@end 

只要這僅僅是一個方法和構造對象,在Objective-C這就是所謂的init ,或初始化和變體。調用它應該直接與「新」。

E.x

#include "notify.h" 
int main(){ 
    Notify* object = new Notify(); 
} 

但是,需要Objective-C中的一些基本的瞭解。我認爲這主要是語法差異。但我自己也不是Objective-C專家。無論如何,有很多方法來解決它,這可能不是最好的主意。你也可以從你的C++類中調用Objective-C代碼。看看下面的鏈接,瞭解如何完成的一個很好的例子。

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++

+0

不幸的是,我不知道如何把這個代碼轉換成適用於Mac一個.mm文件,並從我平時的C++代碼中調用它。 –

+0

這可能會指向你在正確的方向:http://stackoverflow.com/questions/23404158/qt-run-object-c-code 你也可以拆分你的項目,並建立一個dylib,只需加載它作爲一個庫。 (比如windows上的dll,以及linux上的文件) – Meeh

+1

你只需要製作一個頭文件,該頭文件包含.mm目標代碼文件中的對象或函數,然後將其包含在QT項目中,然後可以調用您的函數或對象與任何其他QT/C++函數/對象一樣。 – Meeh