QMenuBar 视窗选单
QMenuBar、QMenu 和 QAction 是 PyQt6 里的选单元件 ( 视窗最上方的选单 ),这篇教学会介绍如何在 PyQt6 视窗里加入 选单元件,并实作点击选单后的基本动作。
快速导览:
因为 Google Colab 不支援 PyQt6,所以请使用本机环境 ( 参考:使用 Python 虚拟环境 ) 或使用 Anaconda Jupyter 进行实作 ( 参考:使用 Anaconda )。
QMenuBar、QMenu 和 QAction 的差别
QMenuBar、QMenu 和 QAction 都是 PyQt6 的选单元件,三个的差别如下:
- QMenuBar:选单主元件,通常一个视窗只会有一个。
- QMenu:选单中带有“子选项”的选项。
- QAction:选单中的选项。
建立视窗选单
建立 PyQt6 视窗对象后,先透过 QtWidgets.QMenuBar(widget) 方法建立 QMenuBar 视窗选单,接着就能使用 QtWidgets.QMenu(str) 建立带有“子选项”的选项,使用 QtGui.QAction(str) 建立单一选项,建立 QAction 或 QMenu 后,可以将其加入 QMenu,而 QMenuBar 只能加入 QMenu ( 此处方法和 PyQt5 不同 )。
下方的程序码执行后,会在建立一个具有一个 File 下拉选单的 QMenuBar,File 下拉选单中有 Open 和 Close 两个选项。
from PyQt6 import QtWidgets, QtGui
import sys
app = QtWidgets.QApplication(sys.argv)
Form = QtWidgets.QWidget()
Form.setWindowTitle('oxxo.studio')
Form.resize(300, 200)
menubar = QtWidgets.QMenuBar(Form) # 建立 menubar
menu_file = QtWidgets.QMenu('File') # 建立一個 File 選項 ( QMenu )
action_open = QtGui.QAction('Open') # 建立一個 Open 選項 ( QAction )
menu_file.addAction(action_open) # 將 Open 選項放入 File 選項裡
action_close = QtGui.QAction('Close') # 建立一個 Close 選項 ( QAction )
menu_file.addAction(action_close) # 將 Close 選項放入 File 選項裡
menubar.addMenu(menu_file) # 將 File 選項放入 menubar 裡
Form.show()
sys.exit(app.exec())
class 写法:
from PyQt6 import QtWidgets, QtGui
import sys
class MyWidget(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('oxxo.studio')
self.resize(300, 200)
self.ui()
def ui(self):
self.menubar = QtWidgets.QMenuBar(self) # 建立 menubar
self.menu_file = QtWidgets.QMenu('File') # 建立一個 File 選項 ( QMenu )
self.action_open = QtGui.QAction('Open') # 建立一個 Open 選項 ( QAction )
self.menu_file.addAction(self.action_open) # 將 Open 選項放入 File 選項裡
self.action_close = QtGui.QAction('Close') # 建立一個 Close 選項 ( QAction )
self.menu_file.addAction(self.action_close) # 將 Close 選項放入 File 選項裡
self.menubar.addMenu(self.menu_file) # 將 File 選項放入 menubar 裡
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
Form = MyWidget()
Form.show()
sys.exit(app.exec())
除了使用 addAction() 方法可以加入单一选项,也可以使用 addActions() 的方法,一次加入以串列组成的多个选项,下方的程序码执行后,会在原本的选单后方加入第二层选单,第二个选单使用 addActions() 添加选项。
from PyQt6 import QtWidgets, QtGui
import sys
app = QtWidgets.QApplication(sys.argv)
Form = QtWidgets.QWidget()
Form.setWindowTitle('oxxo.studio')
Form.resize(300, 200)
menubar = QtWidgets.QMenuBar(Form)
menu_file = QtWidgets.QMenu('File')
action_open = QtGui.QAction('Open')
menu_file.addAction(action_open)
action_close = QtGui.QAction('Close')
menu_file.addAction(action_close)
menu_sub = QtWidgets.QMenu('More') # 建立 More 選項 ( QMenu )
action_A = QtGui.QAction('A') # 建立 A 選項 ( QAction )
action_B = QtGui.QAction('B') # 建立 B 選項 ( QAction )
menu_sub.addActions([action_A, action_B]) # More 選項中加入 A 和 B
menu_file.addMenu(menu_sub) # 將 More 選項放入 File 選項裡
menubar.addMenu(menu_file)
Form.show()
sys.exit(app.exec())
class 写法:
from PyQt6 import QtWidgets, QtGui
import sys
class MyWidget(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('oxxo.studio')
self.resize(300, 200)
self.ui()
def ui(self):
self.menubar = QtWidgets.QMenuBar(self)
self.menu_file = QtWidgets.QMenu('File')
self.action_open = QtGui.QAction('Open')
self.menu_file.addAction(self.action_open)
self.action_close = QtGui.QAction('Close')
self.menu_file.addAction(self.action_close)
self.menu_sub = QtWidgets.QMenu('More') # 建立 More 選項 ( QMenu )
self.action_A = QtGui.QAction('A') # 建立 A 選項 ( QAction )
self.action_B = QtGui.QAction('B') # 建立 B 選項 ( QAction )
self.menu_sub.addActions([self.action_A, self.action_B]) # More 選項中加入 A 和 B
self.menu_file.addMenu(self.menu_sub) # 將 More 選項放入 File 選項裡
self.menubar.addMenu(self.menu_file)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
Form = MyWidget()
Form.show()
sys.exit(app.exec())
加入分隔线
选单的选项顺序是按照加入的顺序决定,因此在加入选项的过程中,可以使用 addSeparator() 方法在指定的位置加入分隔线。
from PyQt6 import QtWidgets, QtGui
import sys
app = QtWidgets.QApplication(sys.argv)
Form = QtWidgets.QWidget()
Form.setWindowTitle('oxxo.studio')
Form.resize(300, 200)
menubar = QtWidgets.QMenuBar(Form)
menu_file = QtWidgets.QMenu('File')
action_open = QtGui.QAction('Open')
menu_file.addAction(action_open)
menu_file.addSeparator() # 加入分隔線
action_close = QtGui.QAction('Close')
menu_file.addAction(action_close)
menubar.addMenu(menu_file)
Form.show()
sys.exit(app.exec())
class 写法:
from PyQt6 import QtWidgets, QtGui
import sys
class MyWidget(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('oxxo.studio')
self.resize(300, 200)
self.ui()
def ui(self):
self.menubar = QtWidgets.QMenuBar(self)
self.menu_file = QtWidgets.QMenu('File')
self.action_open = QtGui.QAction('Open')
self.menu_file.addAction(self.action_open)
self.menu_file.addSeparator() # 加入分隔線
self.action_close = QtGui.QAction('Close')
self.menu_file.addAction(self.action_close)
self.menubar.addMenu(self.menu_file)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
Form = MyWidget()
Form.show()
sys.exit(app.exec())
加入快捷键、Icon 图示
建立选项后,可以透过下列方法设定该选项的快捷键、Icon 图示:
| 方法 | 说明 |
|---|---|
| setIcon() | 加入 icon 图示,图示需要使用 QtGui.QIcon() 方法。 |
| setShortcut() | 加入快捷键,快捷键的格式为 Ctrl、Shift 或 Alt 搭配“+”与大写字母所组成 ( 注意,如果快捷键和系统默认相同,则不会显示,例如 Ctrl+Q 是关闭视窗 )。 |
下方的程序码执行后,会在两个选项前方加上 icon,并加入快捷键的说明
from PyQt6 import QtWidgets, QtGui
import sys
app = QtWidgets.QApplication(sys.argv)
Form = QtWidgets.QWidget()
Form.setWindowTitle('oxxo.studio')
Form.resize(300, 200)
menubar = QtWidgets.QMenuBar(Form)
menu_file = QtWidgets.QMenu('File')
action_open = QtGui.QAction('Open')
action_open.setIcon(QtGui.QIcon('icon.png'))
action_open.setShortcut('Ctrl+O')
menu_file.addAction(action_open)
action_close = QtGui.QAction('Close')
action_close.setIcon(QtGui.QIcon('mona.jpg'))
action_close.setShortcut('Shift+Ctrl+Q')
menu_file.addAction(action_close)
menubar.addMenu(menu_file)
Form.show()
sys.exit(app.exec())
class 写法:
from PyQt6 import QtWidgets, QtGui
import sys
class MyWidget(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('oxxo.studio')
self.resize(300, 200)
self.ui()
def ui(self):
self.menubar = QtWidgets.QMenuBar(self)
self.menu_file = QtWidgets.QMenu('File')
self.action_open = QtGui.QAction('Open')
self.action_open.setIcon(QtGui.QIcon('icon.png'))
self.action_open.setShortcut('Ctrl+O')
self.menu_file.addAction(self.action_open)
self.action_close = QtGui.QAction('Close')
self.action_close.setIcon(QtGui.QIcon('mona.jpg'))
self.action_close.setShortcut('Shift+Ctrl+Q')
self.menu_file.addAction(self.action_close)
self.menubar.addMenu(self.menu_file)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
Form = MyWidget()
Form.show()
sys.exit(app.exec())
视窗选单点击事件
使用 triggered.connect(fn) 方法,就能在点击选单的选项时,执行对应的函数,以下方的程序码为例,点击 open 选项时,会打开选择文件的对话视窗,点击 close 选项时会关闭整个视窗。
from PyQt6 import QtWidgets, QtGui
import sys
app = QtWidgets.QApplication(sys.argv)
Form = QtWidgets.QWidget()
Form.setWindowTitle('oxxo.studio')
Form.resize(300, 200)
def open():
filePath , filterType = QtWidgets.QFileDialog.getOpenFileNames() # 選擇檔案對話視窗
print(filePath , filterType)
def close():
print('close')
app.quit()
menubar = QtWidgets.QMenuBar(Form)
menu_file = QtWidgets.QMenu('File')
action_open = QtGui.QAction('Open')
action_open.triggered.connect(open)
menu_file.addAction(action_open)
action_close = QtGui.QAction('Close')
action_close.triggered.connect(close)
menu_file.addAction(action_close)
menubar.addMenu(menu_file)
Form.show()
sys.exit(app.exec())
class 的写法:
from PyQt6 import QtWidgets, QtGui
import sys
class MyWidget(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('oxxo.studio')
self.resize(300, 200)
self.ui()
def ui(self):
self.menubar = QtWidgets.QMenuBar(self)
self.menu_file = QtWidgets.QMenu('File')
self.action_open = QtGui.QAction('Open')
self.action_open.triggered.connect(self.open)
self.menu_file.addAction(self.action_open)
self.action_close = QtGui.QAction('Close')
self.action_close.triggered.connect(self.close)
self.menu_file.addAction(self.action_close)
self.menubar.addMenu(self.menu_file)
def open(self):
filePath , filterType = QtWidgets.QFileDialog.getOpenFileNames() # 選擇檔案對話視窗
print(filePath , filterType)
def close(self):
print('close')
app.quit()
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
Form = MyWidget()
Form.show()
sys.exit(app.exec())
微信扫码关注
抖音扫码关注