【问题标题】: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_())