PyQt MenuBar Mac OSX Снежный барс - PullRequest
6 голосов
/ 14 февраля 2010

Я пытаюсь добавить элемент в строку меню приложения простого примера PyQt. Тем не менее, следующий код, похоже, не меняет строку меню вообще. Единственный пункт в меню - «Питон». Ниже приведена основная часть кода за вычетом импорта и реализации.

class MainWindow(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)

        self.resize(250, 150)
        self.setWindowTitle('menubar')
        self.modal = False

        exit = QtGui.QAction( QtGui.QIcon('images/app_icon.png'), 'Exit', self )
        exit.setShortcut('Ctrl+Q')
        exit.setStatusTip('Exit application')
        self.connect(exit, QtCore.SIGNAL('triggered()'), QtCore.SLOT('close()'))

        menubar = self.menuBar()
        file = menubar.addMenu('File')
        file.addAction(exit)

Я также пытался создать новый QMenuBar и использовать метод setMenuBar(), чтобы вручную поменять строку меню.

Есть ли явные ошибки в приведенном фрагменте?

Ответы [ 4 ]

6 голосов
/ 21 февраля 2014

Я знаю, что этот вопрос старый, но, поскольку я застрял с той же проблемой, я обнаружил, что, поскольку я создавал действие для выхода из приложения, и это действие зарезервировано в OSX для Меню приложения, меню Файл появляются. Когда я создал новое действие в том же меню, оно стало доступным. Это работало с использованием того же подхода для других ОС:

self.menubar = self.menuBar()

Это было создано внутри объекта QMainWindow.

Надеюсь, это кому-нибудь поможет!

4 голосов
/ 24 июня 2015

При использовании PyQt на Mac система перехватывает определенные команды, содержащие слово «Quit» или «Exit», и удаляет их из меню, потому что они существуют в другом месте. если в заголовке меню нет элементов, он не будет отображаться, и будет выглядеть так, как будто вы не изменили строку меню.

#exit = QtGui.QAction( 'Exit', self ) #this fails on my system
exit = QtGui.QAction( 'SomethingElse', self ) #this displays on my system
menubar = self.menuBar()
fileMenu = menubar.addMenu('&File')
fileMenu.addAction(exit)

Кроме того, вызов метода lift_ () не меняет строку меню на моем Mac. Я должен вручную выбрать окно (щелкнув в другом месте, а затем щелкнув), если я использую повышение_ (), чтобы получить правильную строку меню, отображаемую для моего приложения pyqt.

Также помните, что меню Mac отображаются в системном меню, а не в окне, как на компьютере с Windows или Linux. Это приводит нас к другому решению, предложенному Levi501 и Swdev. То есть использовать не родное меню, которое появляется в окне следующим образом:

menubar = self.menuBar()
menubar.setNativeMenuBar(False)

Как тот, кто использует Windows и Linux много, это имеет больше смысла для моих проектов.

Я нашел информацию «Выход» здесь: http://python.6.x6.nabble.com/addAction-to-menubar-td1916296.html

3 голосов
/ 14 февраля 2010

У меня не установлен PyQt на этом компьютере, чтобы проверить это, но я думаю, что на Mac функция QMainWindow.menuBar() не возвращает широкую строку меню приложения.

Вы можете попытаться создать менюкак:

menubar = QtGui.MenuBar()

Я основываю это на документах для функции QMainWindow.menuBar() здесь:

http://doc.qt.io/qt-4.8/qmainwindow.html#menuBar

Вы также можете проверить раздел с пометкой QMenuBar в Mac OS X на этой странице:

http://doc.qt.io/qt-4.8/qmenubar.html#details

Надеюсь, это поможет!

2 голосов
/ 02 октября 2012

Правильно. В MAC OS нам нужно использовать строку меню следующим образом:

self.menubar = QtGui.QMenuBar() 

И не так:

self.menubar = QtGui.QMenuBar(MainWindow) 

(без параметра MainWindow)

Я предлагаю лучшее решение - использовать QTDesiner для построения макета пользовательского интерфейса, а затем использовать инструмент pyside-uic для преобразования в класс Python на другой платформе. Когда я использовал класс макета пользовательского интерфейса, скомпилированный в Windows в MAC, у меня возникла эта проблема. Решите эту проблему, просто перекомпилировав XML-макет пользовательского интерфейса на MAC с помощью команды pyside-uic AppMain.ui -o ui_AppMain.pyp

После сравнения скомпилированного класса макета пользовательского интерфейса между MAC и Windows единственное отличие состоит в том, что в Max OS X новый объект QMenuBar создается без параметра MainWindow.

...