模式对话框中的全局应用程序菜单处于活动状态(Linux)

Global application menu active in modal dialog box (on Linux)

我正在 Windows 和 Linux (Ubuntu) 上的 PySide 中开发一个应用程序。在 Windows 上,一切都按预期进行。但是在 Linux 上,当我在应用程序中打开模式对话框(甚至是系统对话框,例如 OpenFileDialog)时,全局应用程序菜单仍然保持可见和活动状态。那么模态的意义是什么?

我知道这可能与此重复:Application menu is enabled even if a modal dialog box is open

据此,如果我理解得很好,我将不得不在每个对话框中保留对全局应用程序菜单的引用,并在模式对话框打开时禁用所有菜单操作。并在关闭时启用它。很难相信这是唯一的选择。这只是愚蠢的矫枉过正...

请问还有其他解决办法吗?例如,将菜单栏保持在主 window 标题栏下方,就像我们在 Windows 中一样...我知道它可能不是原生的 Linux "feel and look" 但它是比在模态 windows.

中使用全局菜单要好得多

还是我遗漏了一些简单明了的解决方案?

实际上,您可以通过禁用 QMenu.nativeMenuBar 属性.

将菜单​​栏保留在 window 标题下方以避免此问题

这里有一个 PyQt4 的例子:

from PyQt4 import QtGui


class MainWindow(QtGui.QMainWindow):

    def __init__(self, parent = None):
        super(MainWindow, self).__init__(parent)

        menu_bar = self.menuBar()
        # Deactivate global menu bar on Ubuntu
        menu_bar.setNativeMenuBar(False)
        # Add menu for show
        menu_bar.addMenu('Some menu...').addAction('Hit me!')

        # Open modal dialog for test
        self.button = QtGui.QPushButton('Open dialog', self)
        self.setCentralWidget(self.button)
        self.button.clicked.connect(
            lambda: QtGui.QMessageBox.information(self, 'Hello!', "I'm really modal")
            )


if __name__ == '__main__':
    import sys

    app = QtGui.QApplication(sys.argv)

    w = MainWindow()
    w.show()

    sys.exit(app.exec_())