簡體   English   中英

Qt用戶可自定義的熱鍵

[英]Qt User customizable hotkeys

我正在嘗試使用用戶可自定義的熱鍵設計Qt GUI應用程序。 我遇到的主要問題是如何在應用程序中同步熱鍵,因為多個小部件/組件可能使用特定的熱鍵(例如,副本)。

我目前的策略是使用一個引用類,它包含每個不同熱鍵的QKeySequence對象列表。 每個小部件都必須有一種方法來引用這個主列表,並且具有低級別keyPressEvent自定義實現,它將比較輸入的密鑰和熱鍵。 不過,我並不特別喜歡這種策略,因為它需要在每個小部件中進行重大改造,並且感覺我正在嘗試重新發明輪子。

我還嘗試使用QAction對象,它可以在內部保存QKeySequence快捷方式,然后使用它們來觸發我可以使用插槽和信號處理的高級事件。 但是,我在這里遇到的主要問題是如何管理哪些插槽信號被路由到。

例如,假設我有兩個打開的小部件,它們都可以接收copy動作信號。 我可以將這兩個插槽連接到同一個信號,並利用快捷方式的單個更新點,但事情變得混亂,因為只有活動小部件應該對復制信號起作用,而不是兩個小部件。 我可以重新實現focusOutEventfocusInEvent處理手動連接/斷開插槽,但是這也似乎碰到上述在那里我試圖重新發明輪子,做更多的工作比是必要的同樣的問題。

有沒有更容易解決這個問題的方法?

我不認為這個問題有一個特別簡單/非繁瑣的解決方案,但是當我需要在我的應用程序中添加用戶可自定義的熱鍵時,我就是這樣做的:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM