2010-01-12 66 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的菜单。

相关问题