2017-03-09 34 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()方法,并将其重定向到当前环境,这在其他方面是你的活动窗口

希望帮助