2016-09-19 163 views
3

我一直在開發一個使用PyQt5的GUI,並希望包含一個菜單欄。但是,當我去編寫此功能時,我的菜單不會出現。讓我對如何在PyQt5中實現菜單欄的理解失去了興趣,我在網上尋找了一個預先存在的例子。隨着一些調整我制定了以下測試案例:在PyQt5中缺少menuBar

import sys 
from PyQt5.QtGui import QIcon 
from PyQt5.QtWidgets import QApplication, QMainWindow, QMenuBar, QAction, qApp 

class Example(QMainWindow): 

    def __init__(self): 
     super().__init__() 

     exitAction = QAction(QIcon('exit.png'), '&Exit', self) 
     exitAction.triggered.connect(qApp.quit) 

     menubar = self.menuBar() 
     fileMenu = menubar.addMenu('&Testmenu') 
     fileMenu.addAction(exitAction) 

     self.show() 


if __name__ == '__main__': 
    app = QApplication(sys.argv) 
    ex = Example() 
    sys.exit(app.exec_()) 

當我運行這一點,但是,Testmenu是無處可尋。

我也嘗試在使用pyuic5將.ui文件轉換爲可導入的.py文件之前,在QTCreator中創建菜單欄(以及其他我的GUI佈局)。我認爲這會消除我的一些編程錯誤,但菜單欄仍然不會顯示。有什麼想法嗎?

編輯:

進出口運行使用Python 3.5的代碼(蟒蛇4.1)從Jupyter筆記本電腦中,4.1版。我也在使用運行os 10.1l的Macbook,PyQt 5.7和Qt版本5.7.0。

我已經意識到,如果點擊應用程序窗口,然後再點擊回窗口,菜單欄將變得響應 - 有效地不重點和聚焦應用程序。有了這些信息,我意識到我不是第一個注意到這個問題的人(見https://github.com/robotology/yarp/issues/457)。不幸的是,我仍然不確定如何解決這個問題。

+0

[OS X上的QMenuBar](http://doc.qt.io/qt-5/qmenubar.html#qmenubar-on-os-x)。 – ekhumoro

+0

@ekhumoro我不明白這與我在PyQt中的問題有何關係。 – user144153

+0

這幾乎肯定是一個osx特有的問題。你的例子在Linux上運行良好(可能也在Windows上運行)。由於[菜單在osx上的工作方式似乎不同](http://doc.qt.io/qt-5/osx-issues.html#menu-bar),也許你應該正確地*拼出*你期望看到的內容,和你實際得到什麼。也許一些截圖會有所幫助。你也應該說明你正在使用的qt5/pyqt5的確切版本。 – ekhumoro

回答

3

這不是Qt和PyQt5錯誤。

我認爲你的代碼是zetcode pyqt5 menubar tutorial。我在Mac OS上遇到了完全相同的問題。

第一個解決方案是一個竅門。使用' &Exit'而不是'&Exit'

... 
# exitAction = QAction(QIcon('exit.png'), '&Exit', self) # Not shown 
exitAction = QAction(QIcon('exit.png'), ' &Exit', self) 
... 

的MacOS的全系統菜單欄保留關鍵字,如"Exit""Quit",等出於同樣的原因,yurisnm's example code只顯示除了"Quit"上的菜單項:在'&Exit'開始這樣插入空格蘋果系統。實際上「退出」有TextHeuristicRole,因此覆蓋了「應用程序」菜單中的「退出」行爲。當你點擊「Python」菜單中的「退出python」時,它不會退出,只需打印「退出觸發」。

如果必須使用在其他菜單名稱(例如文件,編輯),您需要更改的動作名稱,如高於或使用QAction::setMenuRole(...)這樣的:

... 
exitAction = QAction(QIcon('exit.png'), '&Exit', self) 
print(exitAction.menuRole()) # It prints "1". QAction::TextHeuristicRole 
exitAction.setMenuRole(QAction.NoRole) 
... 

請閱讀以下內容,這將是幫你。

0

試試這個:的

menubar = QMenuBar() 
self.setMenuBar(menubar) 

代替menubar = self.menuBar()

+0

啊我沒想到要找一套方法。這會讓「Testmenu」顯示在菜單欄中,但exitAction項目仍然丟失。不應該'fileMenu.addAction(exitAction)'填充菜單? – user144153

+0

是的,它應該填充菜單。至少在我的項目中我是這麼做的。還有一些其他的錯誤......你保留線'fileMenu = menubar.addMenu('&Testmenu')'? –

+0

是的,我完好無損。清楚的是,當我運行代碼時,菜單欄創建了一個名爲'Testament'的菜單,但是當我點擊它時沒有任何反應。這幾乎就像它的凍結,除了窗戶本身(和我的機器上的其他所有東西)運行良好。 – user144153

0

您是否嘗試過在以下鏈接tutorialspoint最簡單的例子。

這是最簡單的例子。

import sys 

from PyQt5.QtWidgets import QHBoxLayout, QAction, QApplication, QMainWindow 

class menudemo(QMainWindow): 
    def __init__(self, parent = None): 
     super(menudemo, self).__init__(parent) 

     bar = self.menuBar() 
     file = bar.addMenu("File") 
     file.addAction("New") 

     save = QAction("Save",self) 
     save.setShortcut("Ctrl+S") 
     file.addAction(save) 

     edit = file.addMenu("Edit") 
     edit.addAction("copy") 
     edit.addAction("paste") 

     quit = QAction("Quit",self) 
     file.addAction(quit) 
     file.triggered[QAction].connect(self.processtrigger) 
     self.setWindowTitle("menu demo") 

    def processtrigger(self, q): 
     print(q.text()+" is triggered") 


def main(): 
    app = QApplication(sys.argv) 
    ex = menudemo() 
    ex.show() 
    sys.exit(app.exec_()) 

if __name__ == '__main__': 
    main() 
+0

這個例子完美地工作。我唯一的問題是它使用PyQt4而不是PyQt5。我改變了導入來使用PyQt5,並且在PyQt5.QtWidgets import *中包含了額外的一行'',認爲這個例子仍然可以工作。 Unfornutatly這個例子不適用於PyQt5。我遇到了菜單欄會出現同樣的問題,但點擊它不會擴大菜單。任何想法,這個問題來自哪裏? – user144153

+0

先生,你只需要改變進口,因爲自PyQt5以來他們改變了一些路徑。所以試試看.. [回答更新] – yurisnm

+0

我試過上面的例子時已經改變了導入以使用'PyQt5'。這個例子中的窗口和菜單欄會加載,但除非我不專心,然後將窗口對焦,菜單欄無響應。它接縫是特定於Mac OS X上的Qt或PyQt的問題 – user144153

0

如果您的程序運行在Ubuntu上,你會發現在屏幕的頂部菜單欄。

如果您想將菜單欄移動到窗口的標題欄,可以在「系統設置/外觀/行爲/顯示窗口的菜單/在窗口的標題欄中」切換設置。