創建菜單欄、工具欄和狀態欄可以直接通過代碼實現,也可以通過Qt Designer中的屬性編輯器等實現。通過兩種方法的學習可以加深理解,更好的掌握PyQt5。
一、菜單欄與狀態欄
狀態欄的設置比較簡單,在設置菜單欄的同時,就可以實現狀態欄顯示的設置。
1.1 下拉菜單與子菜單
菜單欄位於窗體標題欄的下方,通過QMenu類可添加菜單欄的小控件,創建上下文菜單和彈出菜單。每個Qmenu對象都可以包含QAction對象。單擊QAction按鈕時,QMenu對象就會發射triggered信號實現功能需求。在舉例說明之前,我們先了解下部分重要的方法。
menuBar() | 返回窗口的QMenu對象 |
addMenu() | 在菜單欄里添加一個新的Qmenu對象 |
addAction() | 向QMenu小空間中添加一個操作按鈕,其中包含文本或圖形 |
addSeperator() | 設置按鈕的狀態(禁用/啟用) |
setShortcut() | 設置快捷鍵 |
setTitle() | 設置菜單項的文本 |
setText | 設置控件的標題 |
text() | 返回QAction對象關聯的文本 |
title() | 返回QMenu控件的標題 |
setStatusTip() | 設置狀態欄信息文本 |
下面是案例代碼

1 import sys 2 from PyQt5.QtWidgets import * 3 from PyQt5.QtGui import QIcon 4 5 class MyWindow(QMainWindow): 6 7 def __init__(self): 8 super().__init__() 9 self.initUI() 10 11 def initUI(self): 12 self.setGeometry(300,300,500,400) 13 self.setWindowTitle('菜單欄例子') 14 self.setWindowIcon(QIcon('chuan.ico')) 15 16 menubar = self.menuBar() 17 file = menubar.addMenu('文件') 18 """設置一級菜單打開按鈕, 這個操作按鈕是QAction對象""" 19 open1 = QAction(QIcon('open.png'),'打開',self) #為打開按鈕設置圖標,顯示文本 20 open1.setShortcut('ctrl+o') #設置快捷鍵 21 open1.setStatusTip('這是打開按鈕') #設置狀態欄信息 22 file.addAction(open1) #添加打開按鈕 23 24 """設置編輯按鈕,這個操作按鈕是字符串""" 25 edit=file.addMenu('編輯') 26 edit.addAction('復制') #設置二級菜單復制 27 edit.addAction('粘貼') #設置二級菜單粘貼 28 29 """另一種方法設置二級菜單""" 30 save = QMenu('保存') 31 al_save = QAction('另存為',self) 32 save.addAction(al_save) 33 file.addMenu(save) 34 35 36 """設置退出按鈕""" 37 quit_menubar = QAction(QIcon('close.ico'),'退出',self) 38 quit_menubar.setShortcut('ctrl+q') 39 quit_menubar.setStatusTip('這是退出') 40 file.addAction(quit_menubar) 41 quit_menubar.triggered.connect(qApp.quit) 42 43 self.statusBar() #初始化狀態欄 44 self.center_show() 45 46 47 def center_show(self): 48 qr = self.frameGeometry() 49 cp = QDesktopWidget().availableGeometry().center() 50 qr.moveCenter(cp) 51 self.move(qr.topLeft()) 52 53 54 if __name__ == "__main__": 55 app = QApplication(sys.argv) 56 win = MyWindow() 57 win.show() 58 sys.exit(app.exec_())
菜單中的操作按鈕可以是字符串或QAction對象。在上面的例子中,“打開”和“退出”按鈕都是QAction對象,而“編輯”按鈕則是字符串對象。
還有一點需要注意,一定要加上self.statusBar()將其實例化,否則無法顯示狀態欄信息。這一命令的位置可以任意放在設置各菜單按鈕的狀態欄信息的前面或后面。
通過Qt Designer則可以很快實現上述過程。
首先,在屬性編輯器里,可以實現對窗體大小,標題,圖標以及窗體狀態欄的設置。但是在對下拉菜單時不能直接添加圖片的(窗體也不能直接添加圖片),需要在PyQt開發目錄下添加qrc文件。方法如下:
(1)點擊右下角資源瀏覽器,新建一個qrc文件,並設置前綴為pic,然后添加圖片資源
(2)在窗體左上角輸入菜單項“文件”。
(3)在動作編輯器中新建下拉菜單動作,並添加圖片、快捷鍵,狀態欄信息等
(4)將編輯好的動作拖到菜單項中,就可以完成操作。
3.2 勾選菜單

1 import sys 2 from PyQt5.QtWidgets import QMainWindow, QAction, QMenu, QApplication,QDesktopWidget 3 from PyQt5.QtGui import QIcon 4 5 6 class MyWindow(QMainWindow): 7 def __init__(self): 8 super().__init__() 9 self.initUI() 10 11 def initUI(self): 12 self.setGeometry(300, 300, 500, 400) 13 self.setWindowTitle('勾選菜單示例') 14 self.setWindowIcon(QIcon('chuan.ico')) 15 self.center_show() 16 17 self.statusbar = self.statusBar() 18 19 menubar = self.menuBar() 20 file = menubar.addMenu('文件') 21 22 sel_menubar = QAction('確認',self,checkable=True) #checkable=True設置為可勾選 23 sel_menubar.setStatusTip('已勾選菜單按鈕') 24 sel_menubar.setShortcut('ctrl+l') 25 sel_menubar.setChecked(True) #默認為已勾選 26 file.addAction(sel_menubar) 27 28 sel_menubar.triggered.connect(self.toggleMenu) 29 30 def toggleMenu(self, state): 31 if state: 32 self.statusbar.show() 33 else: 34 self.statusbar.hide() 35 36 def center_show(self): 37 qr = self.frameGeometry() #獲得主窗口大小 38 cp = QDesktopWidget().availableGeometry().center() #獲取顯示器分辨率,並找到中間點 39 qr.moveCenter(cp) #將窗口中點放在屏幕中間 40 self.move(qr.topLeft()) 41 42 43 if __name__ == '__main__': 44 app = QApplication(sys.argv) 45 win = MyWindow() 46 win.show() 47 sys.exit(app.exec_())
QAction不僅可以實現圖片的插入,還可以通過checkable=True/False設置按鈕是否可勾選。setChecked(True)可以設置勾選菜單初始化是否勾選。本例中還添加了toggleMenu()方法,實現了勾選與否時,狀態欄信息的顯示不同。
如何使用Qt Designer創建勾選菜單不再贅述,仿照上例使用動作編輯器即可。
3.3 右鍵菜單

1 import sys 2 from PyQt5.QtWidgets import QMainWindow, qApp, QMenu, QApplication 3 from PyQt5.QtGui import QIcon 4 5 class MyWindow(QMainWindow): 6 def __init__(self): 7 super().__init__() 8 self.initUI() 9 10 def initUI(self): 11 12 self.setGeometry(300, 300, 500, 400) 13 self.setWindowTitle('Context menu') 14 self.setWindowIcon(QIcon('chuan.ico')) 15 16 def contextMenuEvent(self, event): 17 18 cmenu = QMenu(self) 19 20 newAct = cmenu.addAction("新建") 21 opnAct = cmenu.addAction("打開") 22 quitAct = cmenu.addAction("退出") 23 action = cmenu.exec_(self.mapToGlobal(event.pos())) 24 25 if action == quitAct: 26 qApp.quit() 27 28 29 if __name__ == '__main__': 30 app = QApplication(sys.argv) 31 win = MyWindow() 32 win.show() 33 sys.exit(app.exec_())
這里使用contextMenuEvent()方法實現菜單創建。使用exec_()方法顯示菜單。從鼠標右鍵事件對象中獲得當前坐標。maptoGlobal()方法把當前組件的相對坐標轉換為窗口的絕對坐標。
二、工具欄
工具欄的添加與菜單欄類似,無須贅述。不過注意一點,工具欄添加后只顯示圖標,不會顯示文本。這一點和我們常用的軟件一樣。

1 import sys 2 from PyQt5.QtWidgets import QMainWindow, QAction, qApp, QApplication 3 from PyQt5.QtGui import QIcon 4 5 class MyWindow(QMainWindow): 6 def __init__(self): 7 super().__init__() 8 self.initUI() 9 10 def initUI(self): 11 self.setGeometry(300, 300, 300, 200) 12 self.setWindowTitle('工具欄') 13 self.setWindowIcon(QIcon('chuan.ico')) 14 15 exitAct = QAction(QIcon('close.ico'), '退出', self) 16 exitAct.setShortcut('Ctrl+Q') 17 exitAct.triggered.connect(qApp.quit) 18 19 self.toolbar = self.addToolBar('退出') 20 self.toolbar.addAction(exitAct) 21 22 23 if __name__ == '__main__': 24 app = QApplication(sys.argv) 25 win = MyWindow() 26 win.show() 27 sys.exit(app.exec_())
使用Qt Designer添加工具欄的方法同樣和添加菜單類似。只是首先在窗體是單擊右鍵,選擇添加工具欄,然后就可以通過動作編輯器添加動作,通過屬性編輯器設置圖標