完成一半必需的功能很簡單。只需在主窗口類中創建編輯菜單以及必要的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接收焦點的小部件會發生意外的安靜情況。在我看來,這種方法最糟糕的缺點是無法正確控制「編輯」菜單項的啓用狀態。從通用小部件查詢是否可以執行復制或粘貼操作是不可能的。
我無法找到這個問題的真正解決方案 - 並且會驚奇地發現存在一個問題 - 因爲複製/粘貼功能通常隱藏在類的代碼中,並且不通過任何標準信號集/槽。今晚對功能的實驗後,我決定忘記從我的應用程序中有一個編輯菜單,並期望用戶知道鍵盤快捷方式,或使用上下文相關的菜單。
可怕的消息。不過謝謝 – aehlke