[英]Qt User customizable hotkeys
我正在嘗試使用用戶可自定義的熱鍵設計Qt GUI應用程序。 我遇到的主要問題是如何在應用程序中同步熱鍵,因為多個小部件/組件可能使用特定的熱鍵(例如,副本)。
我目前的策略是使用一個引用類,它包含每個不同熱鍵的QKeySequence
對象列表。 每個小部件都必須有一種方法來引用這個主列表,並且具有低級別keyPressEvent
自定義實現,它將比較輸入的密鑰和熱鍵。 不過,我並不特別喜歡這種策略,因為它需要在每個小部件中進行重大改造,並且感覺我正在嘗試重新發明輪子。
我還嘗試使用QAction
對象,它可以在內部保存QKeySequence
快捷方式,然后使用它們來觸發我可以使用插槽和信號處理的高級事件。 但是,我在這里遇到的主要問題是如何管理哪些插槽信號被路由到。
例如,假設我有兩個打開的小部件,它們都可以接收copy
動作信號。 我可以將這兩個插槽連接到同一個信號,並利用快捷方式的單個更新點,但事情變得混亂,因為只有活動小部件應該對復制信號起作用,而不是兩個小部件。 我可以重新實現focusOutEvent
和focusInEvent
處理手動連接/斷開插槽,但是這也似乎碰到上述在那里我試圖重新發明輪子,做更多的工作比是必要的同樣的問題。
有沒有更容易解決這個問題的方法?
我不認為這個問題有一個特別簡單/非繁瑣的解決方案,但是當我需要在我的應用程序中添加用戶可自定義的熱鍵時,我就是這樣做的:
1)從具有硬編碼密鑰快捷方式的應用程序開始,例如:
QMenu * editMenu = new QMenu;
QAction * copyItem = menu->addAction(tr("Copy"), this, SLOT(CopyData()));
copyItem->setShortcut(tr("Ctrl+C"));
2)創建一個看起來像這樣的GetKeySequence()函數:
static QHash<QString, QKeySequence> _usersKeyPreferences;
static bool _usersKeyPreferencesLoaded = false;
QKeySequence GetKeySequence(const QString & keySequence, const QString & contextStr)
{
if (_usersKeyPreferencesLoaded == false)
{
// Oops, time to load in the user's saved custom-key settings from a file somewhere
_usersKeyPreferences = LoadUsersKeyPreferencesFromFile();
_usersKeyPreferencesLoaded = true; // so we'll only try to load the file once
}
if (_usersKeyPreferences.contains(contextStr))
{
return _usersKeyPreferences[contextStr];
}
else
{
// No user preference specified? Okay, fall back to using the
// hard-coded default key sequence instead.
return QKeySequence(qApp->translate(contextStr, keySequence));
}
}
3)現在這個單調乏味的部分:對所有代碼進行深入研究,以及明確指定鍵序列的任何地方(如步驟1中顯示的代碼的第三行),通過調用GetKeySequence()包裝它,像這樣:
copyItem->setShortcut(GetKeySequence(tr("Ctrl+C"), tr("Edit_Menu|Copy")));
4)此時,您的程序的鍵序列將是可定制的; 在GUI創建代碼運行之前,確保密鑰設置文件存在於磁盤上。 這是我程序的鍵映射文件(我將其存儲為簡單的ASCII文本文件)的摘錄:
Edit_Menu|Copy = Ctrl+C
Edit_Menu|Cut = Ctrl+X
Edit_Menu|Paste = Ctrl+V
[... and so on for all other menu items, etc...]
......當然,這種方法的一個缺點是,一旦創建了GUI,就無法“動態”修改密鑰綁定(至少,沒有大量額外的編碼)。 我的程序只需通過關閉然后在用戶單擊“編輯鍵綁定”對話框中的“保存並應用”后重新創建所有窗口來解決此問題。
5)一個可選的進一步步驟(預先做一些額外的工作,但從長遠來看節省時間)是編寫一個程序(或腳本),它可以查看程序代碼庫中的所有.cpp文件,查找調用中的GetKeySequence()碼。 當它找到GetKeySequence()調用時,它會解析出調用的兩個參數,並使用默認設置將它們作為一行打印在一個鍵綁定文件中。 這很有用,因為您可以將此腳本作為autobuild的一部分,此后,無論何時向您的新菜單項(或其他鍵序列說明符)添加新菜單項(或其他鍵序列說明符),您都不必記住手動更新默認鍵設置文件。程序。
無論如何,這對我來說效果很好。 優點是您根本不必重構現有程序; 您可以根據需要插入GetKeySequence(),同時保持程序的較大邏輯/結構不變。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.