我有结构通常如下的应用程序:QT:多个QWidgets之间共享MAC菜单仅触发主窗口的函数
class MultiEditor : public QWidget
{
...
MultiSplitter *mSplitter;
...
}
MultiEditor::MultiEditor(Main *main, QWidget * parent)
{
...
mActions[SplitHorizontally] = action = new QAction(tr("Split To Right"), this);
action->setShortcut(tr("Ctrl+P, 3", "Split To Right"));
connect(action, SIGNAL(triggered()), this, SLOT(splitHorizontally()));
settings->addAction(action, "editor-split-right", editorCategory);
...
}
void MultiEditor::splitHorizontally()
{
... do something on &mSplitter (above);
}
和一类主窗口:
MainWindow::MainWindow(Main * main)
{
...
mEditors = new MultiEditor(main);
setCurrentMultiEditor(mEditors);
...
createActions();
mMenu = createMenus();
this->setMenuBar(mMenu);
...
}
并且创建类子窗口一个小部件:
SubWindow::SubWindow(QVariant * splitterData = 0, QWidget * parent = 0)
{
...
sEditors = new MultiEditor(Main::instance(), this);
setCurrentMultiEditor(sEditors);
...
#ifndef Q_OS_MAC
QMenuBar *newMenu = main->createMenus();
newMenu->setSizePolicy(QSizePolicy ::Expanding , QSizePolicy ::Fixed);
windowLayout->addWidget(newMenu);
#endif
...
}
和实际的菜单构造:
QMenuBar * MainWindow::createMenus()
{
QMenuBar *menuBar;
QMenu *menu;
QMenu *submenu;
...
#ifdef Q_OS_MAC
menuBar = new QMenuBar(0);
#else
menuBar = new QMenuBar();
#endif
...
menu->addAction(currentMultiEditor()->action(MultiEditor::SplitHorizontally));
...
return menuBar;
}
让我们假设我有主窗口和一个打开的子窗口。 两者都创建一个带有分配器的MultiEditor。 所有这些在Ubuntu上运行良好:每个动作都与正确的Splitter相关联。例如,如果我点击SubWindow的Splitter,然后触发“splitHorizontally”操作,SubWindow的MultiEditor:splitHorizontally()被触发,并且SubWindow的Splitter受到影响。
这在Mac上不会发生。在这里,如果我点击一个SubWindow的Splitter,那么MainWindow的mSplitter会受到影响。 我相信点击一个mSplitter,我会关注那个mSplitter,所以MAC的无父母菜单会在任何mSplitter集中的情况下执行。但恰巧它被MainWindow上的mSplitter所阻塞。
其实,这可能是因为我在想,该功能currentMultiEditor()是动态的(每次动作被触发,不同MultiEditor被称为时间),但在真相创建菜单时multiEditor固定(在MAC中,菜单仅在MainWindow上创建,因此currentMultiEditor()将是MainWindow的mEditors,并且在任何时候该操作都是从任何地方触发的)。
什么是最适合你的设计? 我应该在MAC上创建新菜单吗?怎么样?
既然你会放弃你的赏金点,你会如此友善地接受我的答案,并将赏金交给我? :) –
反正你会得到赏金,不是吗?除非在宽限期结束之前出现不同的答案并被接受。 – Darklighter
根据http://stackoverflow.com/help/bounty奖金会在宽限期后被自动授予满分为2或更高的答案:( –