完成一半必需的功能很简单。只需在主窗口类中创建编辑菜单以及必要的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