在這部分的PyQt5教程中,我們將創(chuàng)建菜單和工具欄仑性。菜單式位于菜單欄的一組命令操作惶楼。工具欄是應(yīng)用窗體中由按鈕和一些常規(guī)命令操作組成的組件。
QMainWindow類提供了一個應(yīng)用主窗口虏缸。默認(rèn)創(chuàng)建一個擁有狀態(tài)欄鲫懒、工具欄和菜單欄的經(jīng)典應(yīng)用窗口骨架。
import sys
from PyQt5.QtWidgets import QMainWindow, QApplication
class Example(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.statusBar().showMessage('Ready')
self.setGeometry(300, 300, 250, 150)
self.setWindowTitle('Statusbar')
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
狀態(tài)欄又QMainWindow組件幫助創(chuàng)建完成(依賴于QMainWindow組件)刽辙。
self.statusBar().showMessage('Ready')
為了得到狀態(tài)欄窥岩,我們調(diào)用了QtGui.QMainWindow
類的statusBar()
方法。第一次調(diào)用這個方法創(chuàng)建了一個狀態(tài)欄宰缤。隨后方法返回狀態(tài)欄對象颂翼。然后用showMessage()
方法在狀態(tài)欄上顯示一些信息。
菜單欄
菜單欄是GUI應(yīng)用的常規(guī)組成部分慨灭。是位于各種菜單中的一組命令操作(Mac OS 對待菜單欄有些不同朦乏。為了獲得全平臺一致的效果,我們可以在代碼中加入一行:menubar.setNativeMenuBar(False)
氧骤。
import sys
from PyQt5.QtWidgets import QMainWindow, QAction, qApp, QApplication
from PyQt5.QtGui import QIcon
class Example(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
exitAction = QAction(QIcon('exit.png'), '&Exit', self)
exitAction.setShortcut('Ctrl+Q')
exitAction.setStatusTip('Exit application')
exitAction.triggered.connect(qApp.quit)
self.statusBar()
menubar = self.menuBar()
fileMenu = menubar.addMenu('&File')
fileMenu.addAction(exitAction)
self.setGeometry(300, 300, 300, 200)
self.setWindowTitle('Menubar')
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
在上面的例子中呻疹,我們創(chuàng)建了有一個菜單項的菜單欄。這個菜單項包含一個選中后中斷應(yīng)用的動作筹陵。
exitAction = QAction(QIcon('exit.png'), '&Exit', self)
exitAction.setShortcut('Ctrl+Q')
exitAction.setStatusTip('Exit application')
QAction是一個用于菜單欄刽锤、工具欄或自定義快捷鍵的抽象動作行為镊尺。在上面的三行中,我們創(chuàng)建了一個有指定圖標(biāo)和文本為'Exit'的標(biāo)簽并思。另外庐氮,還為這個動作定義了一個快捷鍵。第三行創(chuàng)建一個當(dāng)我們鼠標(biāo)浮于菜單項之上就會顯示的一個狀態(tài)提示宋彼。
當(dāng)我們選中特定的動作弄砍,一個觸發(fā)信號會被發(fā)射。信號連接到QApplication組件的quit()方法输涕。這樣就中斷了應(yīng)用音婶。
exitAction.triggered.connect(qApp.quit)
menuBar()方法創(chuàng)建了一個菜單欄。我們創(chuàng)建一個file菜單莱坎,然后將退出動作添加到file菜單中桃熄。
menubar = self.menuBar()
fileMenu = menubar.addMenu('&File')
fileMenu.addAction(exitAction)
工具欄
菜單可以集成所有命令,這樣我們可以在應(yīng)用中使用這些被集成的命令型奥。工具欄提供了一個快速訪問常用命令的方式
# !/usr/bin/python3
# -*- coding: utf-8 -*-
"""
This program creates a toolbar.
The toolbar has one action, which
terminates the application, if triggered.
"""
import sys
from PyQt5.QtWidgets import QMainWindow, QAction, qApp, QApplication
from PyQt5.QtGui import QIcon
class Example(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
exitAction = QAction(QIcon('exit24.png'), 'Exit', self)
exitAction.setShortcut('Ctrl+Q')
exitAction.triggered.connect(qApp.quit)
self.toolbar = self.addToolBar('Exit')
self.toolbar.addAction(exitAction)
self.setGeometry(300, 300, 300, 200)
self.setWindowTitle('Toolbar')
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
子菜單
子菜單是位于另一個菜單中的菜單。
#!/usr/bin/python3
# -*- coding: utf-8 -*-
"""
This program creates a submenu.
"""
import sys
from PyQt5.QtWidgets import QMainWindow, QAction, QMenu, QApplication
class Example(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
menubar = self.menuBar()
fileMenu = menubar.addMenu('File')
impMenu = QMenu('Import', self)
impAct = QAction('Import mail', self)
impMenu.addAction(impAct)
newAct = QAction('New', self)
fileMenu.addAction(newAct)
fileMenu.addMenu(impMenu)
self.setGeometry(300, 300, 300, 200)
self.setWindowTitle('Submenu')
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
在示例中碉京,我們有兩個菜單項; 一個位于“文件”菜單中厢汹,另一個位于“文件”的“導(dǎo)入”子菜單中。
- 使用創(chuàng)建新菜單QMenu谐宙。
impMenu = QMenu('Import', self)
- 將一個動作添加到子菜單中
addAction()
烫葬。
impAct = QAction('Import mail', self)
impMenu.addAction(impAct)
Context menu(彈出菜單)
上下文菜單(也稱為彈出菜單)是在某些上下文下顯示的命令列表。例如凡蜻,在Opera網(wǎng)頁瀏覽器中搭综,當(dāng)我們右鍵單擊網(wǎng)頁時,我們會得到一個上下文菜單划栓。在這里兑巾,我們可以重新加載頁面,返回或查看頁面源忠荞。如果我們右鍵單擊工具欄蒋歌,我們將獲得另一個用于管理工具欄的上下文菜單。
#!/usr/bin/python3
# -*- coding: utf-8 -*-
"""
ZetCode PyQt5 tutorial
This program creates a context menu.
Author: Jan Bodnar
Website: zetcode.com
Last edited: August 2017
"""
import sys
from PyQt5.QtWidgets import QMainWindow, qApp, QMenu, QApplication
class Example(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setGeometry(300, 300, 300, 200)
self.setWindowTitle('Context menu')
self.show()
def contextMenuEvent(self, event):
cmenu = QMenu(self)
newAct = cmenu.addAction("New")
opnAct = cmenu.addAction("Open")
quitAct = cmenu.addAction("Quit")
action = cmenu.exec_(self.mapToGlobal(event.pos()))
if action == quitAct:
qApp.quit()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
工具欄
菜單可以集成所有命令委煤,這樣我們可以在應(yīng)用中使用這些被集成的命令堂油。工具欄提供了一個快速訪問常用命令的方式
#!/usr/bin/python3
# -*- coding: utf-8 -*-
"""
ZetCode PyQt5 tutorial
This program creates a toolbar.
The toolbar has one action, which
terminates the application, if triggered.
Author: Jan Bodnar
Website: zetcode.com
Last edited: August 2017
"""
import sys
from PyQt5.QtWidgets import QMainWindow, QAction, qApp, QApplication
from PyQt5.QtGui import QIcon
class Example(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
exitAct = QAction(QIcon('exit24.png'), 'Exit', self)
exitAct.setShortcut('Ctrl+Q')
exitAct.triggered.connect(qApp.quit)
self.toolbar = self.addToolBar('Exit')
self.toolbar.addAction(exitAct)
self.setGeometry(300, 300, 300, 200)
self.setWindowTitle('Toolbar')
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
上述例子中,我們創(chuàng)建了一個簡單的工具欄碧绞。工具欄有一個動作府框,當(dāng)這個退出動作被觸發(fā)時應(yīng)用將會被中斷。
- 我們創(chuàng)建了一個動作對象讥邻,和之前菜單欄中的部分代碼相似迫靖。這個動作有一個標(biāo)簽院峡,圖標(biāo)和快捷鍵。并且將QtGui.QMainWindow的quit()方法連接到了觸發(fā)信號上袜香。
exitAction = QAction(QIcon('exit24.png'), 'Exit', self)
exitAction.setShortcut('Ctrl+Q')
exitAction.triggered.connect(qApp.quit)
- 這里我們創(chuàng)建了一個工具欄撕予,并且在其中插入一個動作對象。
self.toolbar = self.addToolBar('Exit')
self.toolbar.addAction(exitAction)
組合在一起
#!/usr/bin/python3
# -*- coding: utf-8 -*-
"""
This program creates a skeleton of
a classic GUI application with a menubar,
toolbar, statusbar, and a central widget.
"""
import sys
from PyQt5.QtWidgets import QMainWindow, QTextEdit, QAction, QApplication
from PyQt5.QtGui import QIcon
class Example(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
textEdit = QTextEdit()
self.setCentralWidget(textEdit)
exitAct = QAction(QIcon('exit24.png'), 'Exit', self)
exitAct.setShortcut('Ctrl+Q')
exitAct.setStatusTip('Exit application')
exitAct.triggered.connect(self.close)
self.statusBar()
menubar = self.menuBar()
fileMenu = menubar.addMenu('&File')
fileMenu.addAction(exitAct)
toolbar = self.addToolBar('Exit')
toolbar.addAction(exitAct)
self.setGeometry(300, 300, 350, 250)
self.setWindowTitle('Main window')
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
事例代碼創(chuàng)建了一個帶有菜單欄蜈首、工具欄和狀態(tài)欄的經(jīng)典GUI應(yīng)用骨架实抡。
- 在這里我們創(chuàng)建了一個文本編輯框組件。我們將它設(shè)置成QMainWindow的中心組件欢策。中心組件占據(jù)了所有剩下的空間吆寨。
textEdit = QTextEdit()
self.setCentralWidget(textEdit)
在這個部分的PyQt5中,我們使用了菜單踩寇、工具欄啄清、狀態(tài)欄和一個應(yīng)用主窗口。