2017-03-09 53 views
3

我有結構通常如下的應用程序: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,然後觸發「splitHorizo​​ntally」操作,SubWindow的MultiEditor:splitHorizo​​ntally()被觸發,並且SubWindow的Splitter受到影響。

這在Mac上不會發生。在這裏,如果我點擊一個SubWindow的Splitter,那麼MainWindow的mSplitter會受到影響。 我相信點擊一個mSplitter,我會關注那個mSplitter,所以MAC的無父母菜單會在任何mSplitter集中的情況下執行。但恰巧它被MainWindow上的mSplitter所阻塞。

其實,這可能是因爲我在想,該功能currentMultiEditor()是動態的(每次動作被觸發,不同MultiEditor被稱爲時間),但在真相創建菜單時multiEditor固定(在MAC中,菜單僅在MainWindow上創建,因此currentMultiEditor()將是MainWindow的mEditors,並且在任何時候該操作都是從任何地方觸發的)。

什麼是最適合你的設計? 我應該在MAC上創建新菜單嗎?怎麼樣?

+0

既然你會放棄你的賞金點,你會如此友善地接受我的答案,並將賞金交給我? :) –

+0

反正你會得到賞金,不是嗎?除非在寬限期結束之前出現不同的答案並被接受。 – Darklighter

+0

根據http://stackoverflow.com/help/bounty獎金會在寬限期後被自動授予滿分爲2或更高的答案:( –

回答

2

如果我正確理解你的問題,這看起來確實是一個焦點問題,我並不驚訝Linux的行爲與macOS不同。

可能在macOS上,即使您打開窗口並單擊某處,焦點仍會保留在父窗口中,因此會調用意外的QAction插槽。

我覺得你有2種選擇:

  • 當一個子窗口打開時,請確保它獲得焦點。只在一個地方呼籲窗口的可視部件
  • 接受擊鍵之一QWidget::setFocus()方法,並將其重定向到當前環境,這在其他方面是你的活動窗口

希望幫助