【问题标题】:Global application menu active in modal dialog box (on Linux)在模式对话框中激活的全局应用程序菜单(在 Linux 上)
【发布时间】:2015-08-16 13:36:41
【问题描述】:

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

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

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

那么有没有其他方法可以解决呢?例如,将菜单栏保持在我们在 Windows 上的主窗口标题栏下方......我知道它可能不是原生 Linux 的“感觉和外观”,但它比在模式窗口中拥有全局菜单要好得多。

还是我错过了一些简单明了的解决方案?

【问题讨论】:

标签: qt ubuntu pyqt pyside


【解决方案1】:

您实际上可以通过禁用QMenu.nativeMenuBar 属性来将菜单栏保留在窗口标题的正下方以避免此问题。

以下是 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_())

【讨论】:

    猜你喜欢
    • 2014-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-13
    相关资源
    最近更新 更多