2015-08-16 3 views
1

Я разрабатываю приложение в PySide для Windows и Linux (Ubuntu). В Windows все работает так, как ожидалось. Но в Linux, когда я открываю модальное диалоговое окно в приложении (даже системные диалоги, например OpenFileDialog), глобальное меню приложения остается видимым и активным. Тогда в чем смысл модальности?Глобальное приложение, действующее в модальном диалоговом окне (на Linux)

Я знаю, что это, вероятно, дубликат этого: Application menu is enabled even if a modal dialog box is open

В соответствии с этим, если я хорошо понимаю, я должен был бы сохранить ссылку на глобальное меню приложения в каждом диалоговом окне и отключить все действия меню когда модальное диалоговое окно открывается. И включите его, когда он будет закрыт. Трудно поверить, что это единственный вариант. Это просто глупое переполнение ...

Так есть ли другой вариант, как его решить? Например, сохраняя строку меню под заголовком главного окна, как у нас в Windows ... Я знаю, что это может быть не родной Linux «чувствовать и смотреть», но он намного лучше, чем глобальное меню в модальных окнах.

Или я пропустил какое-то простое и очевидное решение?

+0

Я вижу, что билет ошибка для этого: https://bugs.launchpad.net/indicator-appmenu/+bug/674605 однако любой обходной путь было бы хорошо, пока ошибка не будет решена. –

ответ

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_()) 
Смежные вопросы