我有結構通常如下的應用程序: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或更高的答案:( –