C++ 如何在Qt,esp MacOSX中创建“编辑”菜单

C++ 如何在Qt,esp MacOSX中创建“编辑”菜单,c++,qt,C++,Qt,在大多数应用程序中,MacOSX中的“编辑”菜单相当智能,也很简单:它自动知道当前选定的小部件是否响应相关的ObjC消息剪切:、复制:、粘贴:、选择文本:,并且根据它的不同,菜单动作是否变灰。如果您触发该操作,它只会将该ObjC消息发送到当前选定的小部件。可可守则基本上是: mi = mainMenu.addItemWithTitle_action_keyEquivalent_("Edit", None, "") m = AppKit.NSMenu.alloc().initWithTitle_(

在大多数应用程序中,MacOSX中的“编辑”菜单相当智能,也很简单:它自动知道当前选定的小部件是否响应相关的ObjC消息剪切:、复制:、粘贴:、选择文本:,并且根据它的不同,菜单动作是否变灰。如果您触发该操作,它只会将该ObjC消息发送到当前选定的小部件。可可守则基本上是:

mi = mainMenu.addItemWithTitle_action_keyEquivalent_("Edit", None, "")
m = AppKit.NSMenu.alloc().initWithTitle_("Edit")
mainMenu.setSubmenu_forItem_(m, mi)

m.addItemWithTitle_action_keyEquivalent_('Cut', 'cut:', 'x')
m.addItemWithTitle_action_keyEquivalent_('Copy', 'copy:', 'c')
m.addItemWithTitle_action_keyEquivalent_('Paste', 'paste:', 'v')
m.addItemWithTitle_action_keyEquivalent_('Select all', 'selectText:', 'a')
除此之外,MacOSX检测到这是一个“编辑”菜单,并自动在菜单末尾添加“开始听写…”和“特殊字符…”

现在我正在开发Qt,我希望至少在我的应用程序的MacOSX版本中有这样的行为

现在已经有两个相关的问题:和。然而,两者都有些过时,解决方案也远远不是最优的

有一个应用程序QtCreator似乎做得很好。然而,解决方案似乎相当复杂。我对代码进行了一点深入研究,其中有一些,它将代码与以下内容联系起来:

Context globalContext(Constants::C_GLOBAL);
...
// Select All
icon = QIcon::fromTheme(QLatin1String("edit-select-all"));
tmpaction = new QAction(icon, tr("Select &All"), this);
cmd = am->registerAction(tmpaction, Constants::SELECTALL, globalContext);
cmd->setDefaultKeySequence(QKeySequence::SelectAll);
medit->addAction(cmd, Constants::G_EDIT_SELECTALL);
tmpaction->setEnabled(false);
然后,每个相关小部件似乎都在actionmanager中注册,例如:

这一切似乎都太过分了,尤其是与可可溶液相比

我想知道是否有更简单/更干净的解决方案,更像Cocoa代码。我想用copy,cut,创建一些代理对象。。。插槽,其自身尝试动态调用当前选定小部件上的相关方法/插槽(如果可用)。但不确定这是否会导致以后出现其他问题

另外,在我的例子中,与QtCreator相比,我的应用程序在MacOSX上可能没有打开任何窗口,这是主菜单,但我想这与此无关


另外,我不太习惯其他操作系统的用户指南。同样的行为在Windows/Linux上有意义吗?当然,在那些平台上,没有主菜单——菜单会紧挨着某个窗口。QtCreator似乎在每个操作系统上都有相同的行为。

目前,Qt没有提供任何机制来标记小部件是否可以剪切、复制和粘贴。你需要实现你自己的。无论你想要什么解决方案,都有两个方面

该API向应用程序的其余部分公开。Cocoa API非常简单。我认为,创建者内部公开的API也相当简单

实现该API所需的粘合代码。这段代码可以像它需要的那样复杂,因为您只需要做一次,然后就不用管它了

如果creator提供的代码对您有效,那么除了授权之外,没有其他理由不使用它。不幸的是,可编辑的小部件没有为此提供公共接口,因此需要额外的工作。这样的工作可能更适合Qt本身的源代码——这就是拥有Qt源代码的好处

一个简单的API和一个复杂的API实现没有什么错。这就是Qt的本质。一个简单的信号槽连接机制需要大量的代码来正确地实现它,而不是仅仅在纸上实现的教科书式实现

m_copyAction      = registerNewAction(QLatin1String(Core::Constants::COPY),      this, SLOT(copyAction()), true);
m_cutAction       = registerNewAction(QLatin1String(Core::Constants::CUT),       this, SLOT(cutAction()), true);
m_pasteAction     = registerNewAction(QLatin1String(Core::Constants::PASTE),     this, SLOT(pasteAction()), true);
m_modifyingActions << m_pasteAction;
m_selectAllAction = registerNewAction(QLatin1String(Core::Constants::SELECTALL), this, SLOT(selectAllAction()), true);