2010-01-12 64 views
7

問候,如何通過「撤消」,「剪切」,「粘貼」和「複製」來實現「編輯」菜單?

爲我的應用程序之一我試圖實現「編輯」菜單。此菜單通常具有標準條目撤銷,剪切,複製粘貼

此菜單是不存在默認情況下,和用戶似乎期望它特別是在Mac OS X

是否有實現這個,無需手動每個插件這樣做的更簡單的方法?由於大多數小部件都有通過快捷方式實現的複製/粘貼/撤消機制,因此我想提供一些簡單的菜單操作來調用它們。

行動應該先調用任何小部件的焦點,然後他們應該把事件向上傳遞給對象鏈,我想。

我在Windows,Linux和Mac OS X上使用Qt 4.6。

謝謝!

回答

6

完成一半必需的功能很簡單。只需在主窗口類中創建編輯菜單以及必要的QActions(複製/粘貼/撤銷/等),並將它們連接到插槽。在插槽中,模擬正確的按鍵和釋放事件(例如Ctrl + C進行復制)並將它們發送到當前的焦點小部件。在代碼中,像這樣:

MainWindow::MainWindow(...) 
{ 
    ... 
    connect(actionCopy, SIGNAL(triggered()), SLOT(copy())); 
    ... 
} 
... 
void MainWindow::copy() 
{ 
    QWidget* focused = QApplication::focusWidget(); 
    if(focused != 0) 
    { 
     QApplication::postEvent(focused, 
           new QKeyEvent(QEvent::KeyPress, 
               Qt::Key_C, 
               Qt::ControlModifier)); 
     QApplication::postEvent(focused, 
           new QKeyEvent(QEvent::KeyRelease, 
               Qt::Key_C, 
               Qt::ControlModifier)); 
} 

當然,這是相當黑客。您需要修改每個目標平臺的代碼,將鍵盤快捷鍵更改爲正確的鍵盤快捷鍵,並且可能發生的情況是,使用Ctrl + C接收焦點的小部件會發生意外的安靜情況。在我看來,這種方法最糟糕的缺點是無法正確控制「編輯」菜單項的啓用狀態。從通用小部件查詢是否可以執行復制或粘貼操作是不可能的。

我無法找到這個問題的真正解決方案 - 並且會驚奇地發現存在一個問題 - 因爲複製/粘貼功能通常隱藏在類的代碼中,並且不通過任何標準信號集/槽。今晚對功能的實驗後,我決定忘記從我的應用程序中有一個編輯菜單,並期望用戶知道鍵盤快捷方式,或使用上下文相關的菜單。

+1

可怕的消息。不過謝謝 – aehlke

0

我的印象是,編輯菜單適用於中央文檔小部件,而不是小部件的加載。我還沒有測試過,但是如果你有一個帶有QLineEdits的表單,編輯菜單(在菜單欄中)是否真的適用於那個小部件。不要簡單地調出上下文菜單或按快捷鍵訪問這些選項...

+2

對於像窗口管理器這樣的Windows/Linux,這可能是正確的。但是,在OS X上,屏幕頂部有一個應用程序範圍的菜單欄,而不是每個窗口的頂部。 Mac用戶期望所選擇的菜單操作對最上面的窗口和當前具有焦點的小部件產生影響。 (選擇粘貼會將剪貼板中的任何內容粘貼到當前具有焦點的QLineEdit等等) – BastiBen

0

user285740的解決方案沒有幫助我,因爲我在我的應用程序中使用瀏覽器控件(CEF或WebKit,無所謂)。

爲什麼?對於瀏覽器,focusWidget()似乎總是NULL,因爲<input>元素不是小部件。我嘗試postEvent()到其他小部件 - 沒有工作。使用QAction::TextHeuristicRole + QKeySequence::Copy等標準序列添加菜單項也沒有完成這項工作(我可以將它們僅連接到我的插槽,而不連接到標準插槽)。 Cefclient示例加載一個xib文件,但它不是我的選擇,因爲Qt從頭開始創建所有內容。

最終,我找到了解決方案!從ObjectiveC++代碼創建相同的菜單項。它們就像通過QMenuBar,但中創建的,他們可以連接到一些真正的自動操作,如@selector(copy:)

你可以在這裏找到一個例子(!):nsMenuUtilsX::GetStandardEditMenuItem(),只要做,從你ObjC++代碼。

但是,如果您在QApplication::exec()之前執行此代碼不起作用。 Qt然後用程序「重寫」主菜單... 如何解決這個問題?好吧,也許我會添加一些像QTimer一樣的黑客。 如果您不嘗試通過QMenuBar添加其他項目,則不這樣做。現在好了!獨立於Qt的菜單。

相關問題