PyQt6安裝
- 使用pip工具安裝PyQt6工具。
pip install PyQt6
- 安裝Qt Designer圖形界面開發工具。
pip install PyQt6-tools
PyQt6中的菜單欄和工具欄
在PyQt6教程的這一部分中,我們将建立狀态欄、菜單欄和工具欄。菜單是位于菜單欄中的一組指令。工具欄具有應用程式中一些常用指令的按鈕。狀态欄顯示狀态資訊,通常位于應用程式視窗的底部。
PyQt6 QMainWindow
QMainWindow類提供了一個主應用程式視窗。這樣就可以建立一個帶有狀态欄、工具欄和菜單欄的經典應用程式架構。
PyQt6狀态欄
狀态欄是用于顯示狀态資訊的控件。
import sys
from PyQt6.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, 350, 250)
self.setWindowTitle('Statusbar')
self.show()
def main():
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec())
if __name__ == '__main__':
main()
狀态欄是在QMainWindow控件的幫助下建立的。
self.statusBar().showMessage('Ready')
為了獲得狀态欄,我們調用QtGui.QMainWindow類的statusBar方法。該方法的第一次調用将建立一個狀态欄。随後的調用傳回狀态欄對象。showMessage在狀态欄上顯示一條消息。
PyQt6簡單的菜單
菜單欄是GUI應用程式的常見部分。它是位于各種菜單中的一組指令。(Mac OS對菜單的處理方式不同。要獲得類似的結果,我們可以添加以下行:menubar.setNativeMenuBar(False)。
import sys
from PyQt6.QtWidgets import QMainWindow, QApplication
from PyQt6.QtGui import QIcon, QAction
class Example(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
exitAct = QAction(QIcon('img/exit.png'), '&Exit', self)
exitAct.setShortcut('Ctrl+Q')
exitAct.setStatusTip('Exit application')
exitAct.triggered.connect(QApplication.instance().quit)
self.statusBar()
menubar = self.menuBar()
fileMenu = menubar.addMenu('&File')
fileMenu.addAction(exitAct)
self.setGeometry(300, 300, 350, 250)
self.setWindowTitle('Simple menu')
self.show()
def main():
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec())
if __name__ == '__main__':
main()
在上面的例子中,我們建立了一個隻有一個菜單的菜單欄。此菜單包含一個操作,如果選中,該操作将終止應用程式。狀态欄也會被建立。該操作可以通過Ctrl+Q快捷鍵通路。
exitAct = QAction(QIcon('img/exit.png'), '&Exit', self)
exitAct.setShortcut('Ctrl+Q')
exitAct.setStatusTip('Exit application')
QAction是對使用菜單欄、工具欄或自定義鍵盤快捷鍵執行的操作的抽象。在上面的三行代碼中,我們建立了一個帶有特定圖示和'Exit'标簽的操作。此外,還為該操作定義了一個快捷方式。第三行建立一個狀态提示,當我們将滑鼠指針懸停在菜單項上時,它将顯示在狀态欄中。
exitAct.triggered.connect(QApplication.instance().quit)
當我們選擇這個特定的動作時,一個被觸發的信号被發射。信号連接配接到QApplication控件的退出方法。這将終止應用程式。
menubar = self.menuBar()
fileMenu = menubar.addMenu('&File')
fileMenu.addAction(exitAct)
menuBar方法建立一個菜單欄。我們用addMenu建立一個檔案菜單,并用addAction添加動作。
PyQt6子菜單
子菜單是位于另一個菜單中的菜單。
import sys
from PyQt6.QtWidgets import QMainWindow, QMenu, QApplication
from PyQt6.QtGui import QAction
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, 350, 250)
self.setWindowTitle('Submenu')
self.show()
def main():
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec())
if __name__ == '__main__':
main()
在這個例子中,我們有兩個菜單項;一個位于檔案菜單,另一個位于檔案的導入子菜單。
impMenu = QMenu('Import', self)
使用QMenu建立新菜單。
impAct = QAction('Import mail', self)
impMenu.addAction(impAct)
通過addAction向子菜單添加一個操作。
PyQt6可選菜單
在下面的示例中,我們建立了一個可以勾選和取消勾選的菜單。
import sys
from PyQt6.QtWidgets import QMainWindow, QApplication
from PyQt6.QtGui import QAction
class Example(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.statusbar = self.statusBar()
self.statusbar.showMessage('Ready')
menubar = self.menuBar()
viewMenu = menubar.addMenu('View')
viewStatAct = QAction('View statusbar', self, checkable=True)
viewStatAct.setStatusTip('View statusbar')
viewStatAct.setChecked(True)
viewStatAct.triggered.connect(self.toggleMenu)
viewMenu.addAction(viewStatAct)
self.setGeometry(300, 300, 350, 250)
self.setWindowTitle('Check menu')
self.show()
def toggleMenu(self, state):
if state:
self.statusbar.show()
else:
self.statusbar.hide()
def main():
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec())
if __name__ == '__main__':
main()
代碼示例建立了一個可操作的View菜單。該操作顯示或隐藏狀态欄。當狀态欄可見時,菜單項被選中。
viewStatAct = QAction('View statusbar', self, checkable=True)
使用可勾選選項,我們建立了一個可選菜單。
viewStatAct.setChecked(True)
因為狀态欄從一開始就是可見的,是以我們用setChecked方法來勾選這個動作。
def toggleMenu(self, state):
if state:
self.statusbar.show()
else:
self.statusbar.hide()
根據操作的狀态,顯示或隐藏狀态欄。
PyQt6上下文菜單
上下文菜單,也稱為彈出菜單,是出現在某個上下文下的指令清單。例如,在Opera網絡浏覽器中,當我們右擊網頁時,我們會得到一個上下文菜單。在這裡,我們可以重新加載頁面、傳回或檢視頁面源。如果我們右鍵單擊工具欄,我們會得到另一個管理工具欄的上下文菜單。
import sys
from PyQt6.QtWidgets import QMainWindow, QMenu, QApplication
class Example(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setGeometry(300, 300, 350, 250)
self.setWindowTitle('Context menu')
self.show()
def contextMenuEvent(self, event):
cmenu = QMenu(self)
newAct = cmenu.addAction("New")
openAct = cmenu.addAction("Open")
quitAct = cmenu.addAction("Quit")
action = cmenu.exec(self.mapToGlobal(event.pos()))
if action == quitAct:
QApplication.instance().quit()
def main():
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec())
if __name__ == '__main__':
main()
要使用上下文菜單,我們必須重新實作contextMenuEvent方法。
action = cmenu.exec(self.mapToGlobal(event.pos()))
使用exec方法顯示上下文菜單。從事件對象擷取滑鼠指針的坐标。mapToGlobal方法将控件坐标轉換為全局螢幕坐标。
if action == quitAct:
QApplication.instance().quit()
如果從上下文菜單傳回的操作等于quit操作,則終止應用程式。
PyQt6工具欄
菜單将我們可以在應用程式中使用的所有指令分組。工具欄提供了對最常用指令的快速通路。
import sys
from PyQt6.QtWidgets import QMainWindow, QApplication
from PyQt6.QtGui import QIcon, QAction
class Example(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
exitAct = QAction(QIcon('img/exit.png'), 'Exit', self)
exitAct.setShortcut('Ctrl+Q')
exitAct.triggered.connect(QApplication.instance().quit)
self.toolbar = self.addToolBar('Exit')
self.toolbar.addAction(exitAct)
self.setGeometry(300, 300, 350, 250)
self.setWindowTitle('Toolbar')
self.show()
def main():
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec())
if __name__ == '__main__':
main()
在上面的示例中,我們建立了一個簡單的工具欄。工具欄有一個工具操作,即當被觸發時終止應用程式的退出操作。
exitAct = QAction(QIcon('img/exit.png'), 'Exit', self)
exitAct.setShortcut('Ctrl+Q')
exitAct.triggered.connect(QApplication.instance().quit)
類似于上面的菜單欄示例,我們建立了一個動作對象。該對象具有标簽、圖示和快捷方式。QApplication的退出方法連接配接到觸發信号。
self.toolbar = self.addToolBar('Exit')
self.toolbar.addAction(exitAction)
工具欄是使用addToolBar方法建立的。我們通過addAction向工具欄添加一個動作對象。
PyQt6主視窗
在本節的最後一個示例中,我們将建立一個菜單欄、工具欄和狀态欄。我們還建立了一個中心控件。
import sys
from PyQt6.QtWidgets import QMainWindow, QTextEdit, QApplication
from PyQt6.QtGui import QIcon, QAction
class Example(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
textEdit = QTextEdit()
self.setCentralWidget(textEdit)
exitAct = QAction(QIcon('img/exit.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()
def main():
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec())
if __name__ == '__main__':
main()
這個代碼示例建立了一個帶有菜單欄、工具欄和狀态欄的經典GUI應用程式的架構。
textEdit = QTextEdit()
self.setCentralWidget(textEdit)
這裡我們建立了一個文本編輯控件。我們将它設定為QMainWindow的中心控件。中央控件會占用所有剩餘的空間。
在PyQt6教程的這一部分中,我們使用了菜單、工具欄、狀态欄和主應用程式視窗。