教學(xué)網(wǎng)站前臺(tái)模板站長(zhǎng)網(wǎng)站優(yōu)化公司
????????在 PySide中,contextMenuEvent()
?是?QWidget
?類(以及繼承自它的所有子類)的一個(gè)事件處理方法,主要用于處理上下文菜單事件,也就是當(dāng)用戶在控件上右鍵點(diǎn)擊時(shí)觸發(fā)的事件。
? 通過(guò)重新定義contextMenuEvent()來(lái)實(shí)現(xiàn)自定義的鼠標(biāo)右鍵菜單
from PySide6.QtGui import QAction
from PySide6.QtWidgets import QApplication, QWidget, QMenu
from PySide6.QtCore import Qtclass MyWidget(QWidget):def __init__(self):super().__init__()# 創(chuàng)建一個(gè)菜單self.menu = QMenu(self)# 創(chuàng)建菜單項(xiàng)action1 = QAction("菜單項(xiàng)1", self)action2 = QAction("菜單項(xiàng)2", self)# 將菜單項(xiàng)添加到菜單中self.menu.addAction(action1)self.menu.addAction(action2)# 連接信號(hào)和槽,定義點(diǎn)擊菜單項(xiàng)后的行為action1.triggered.connect(self.on_action1_triggered)action2.triggered.connect(self.on_action2_triggered)def contextMenuEvent(self, event):# 在鼠標(biāo)點(diǎn)擊的位置顯示菜單self.menu.exec(event.globalPos())def on_action1_triggered(self):print("菜單項(xiàng)1被觸發(fā)")def on_action2_triggered(self):print("菜單項(xiàng)2被觸發(fā)")# 應(yīng)用程序執(zhí)行部分
if __name__ == "__main__":app = QApplication([])widget = MyWidget()widget.show()app.exec()
?? 將其定義在子部件內(nèi):
from PySide6.QtGui import QAction
from PySide6.QtWidgets import QApplication, QWidget, QMenu, QPushButtonclass MyWidget(QWidget):def __init__(self):super().__init__()self.setupUi()def setupUi(self):self.button = MyButton(self)class MyButton(QPushButton):def __init__(self, parent=None):super().__init__(parent)self.setText("右鍵點(diǎn)擊我")# 創(chuàng)建一個(gè)菜單self.menu = QMenu(self)# 創(chuàng)建菜單項(xiàng)action1 = QAction("菜單項(xiàng)1", self)action2 = QAction("菜單項(xiàng)2", self)# 將菜單項(xiàng)添加到菜單中self.menu.addAction(action1)self.menu.addAction(action2)# 連接信號(hào)和槽,定義點(diǎn)擊菜單項(xiàng)后的行為action1.triggered.connect(self.on_action1_triggered)action2.triggered.connect(self.on_action2_triggered)def contextMenuEvent(self, event):# 在鼠標(biāo)點(diǎn)擊的位置顯示菜單self.menu.exec(event.globalPos())def on_action1_triggered(self):print("菜單項(xiàng)1被觸發(fā)")def on_action2_triggered(self):print("菜單項(xiàng)2被觸發(fā)")# 應(yīng)用程序執(zhí)行部分
if __name__ == "__main__":app = QApplication([])widget = MyWidget()widget.show()app.exec()
上述代碼,只有在按鈕上有鼠標(biāo)右鍵菜單。?
? 獲取系統(tǒng)默認(rèn)的右鍵菜單并添加新的菜單項(xiàng)?
import sys
from PySide6.QtGui import QAction
from PySide6.QtWidgets import QApplication, QLineEdit, QMenuclass MyLineEdit(QLineEdit):def __init__(self, parent=None):super().__init__(parent)self.setText("右鍵點(diǎn)擊我")self.menu = QMenu(self) # 創(chuàng)建一個(gè)菜單self.addMenus() # 添加菜單的菜單項(xiàng)def addMenus(self):# 獲取系統(tǒng)默認(rèn)的上下文菜單動(dòng)作default_actions = self.createStandardContextMenu().actions()# 將默認(rèn)動(dòng)作添加到新菜單中for action in default_actions:print(action.text())self.menu.addAction(action)# 將新的菜單項(xiàng)添加到新菜單中self.action1 = QAction("菜單項(xiàng)1", self)self.action2 = QAction("菜單項(xiàng)2", self)self.menu.addSeparator() # 創(chuàng)建分割線# 添加自定義菜單項(xiàng)self.menu.addAction(self.action1)self.menu.addAction(self.action2)# 連接信號(hào)和槽函數(shù)self.action1.triggered.connect(self.on_action1_triggered)self.action2.triggered.connect(self.on_action2_triggered)# 重寫(xiě)上下文菜單事件def contextMenuEvent(self, event):# 顯示菜單self.menu.exec(event.globalPos())def on_action1_triggered(self):print("菜單項(xiàng)1被點(diǎn)擊")def on_action2_triggered(self):print("菜單項(xiàng)2被點(diǎn)擊")if __name__ == "__main__":app = QApplication(sys.argv)line_edit = MyLineEdit()line_edit.show()sys.exit(app.exec())
????????上面的代碼,讀取了系統(tǒng)內(nèi)置的默認(rèn)右鍵菜單,并增加了兩個(gè)自定義的菜單項(xiàng),構(gòu)成了一個(gè)新的菜單。重寫(xiě)了contextMenuEvent(),使其顯示新的菜單。
?? 為新菜單設(shè)置快捷方式
import sys
from PySide6.QtGui import QAction
from PySide6.QtWidgets import QApplication, QLineEdit, QMenuclass MyLineEdit(QLineEdit):def __init__(self, parent=None):super().__init__(parent)self.setText("右鍵點(diǎn)擊我")self.menu = QMenu(self) # 創(chuàng)建一個(gè)菜單self.addMenus() # 添加菜單的菜單項(xiàng)def addMenus(self):# 獲取系統(tǒng)默認(rèn)的上下文菜單動(dòng)作default_actions = self.createStandardContextMenu().actions()# 將默認(rèn)動(dòng)作添加到新菜單中for action in default_actions:self.menu.addAction(action)# 將新的菜單項(xiàng)添加到新菜單中self.action1 = QAction("菜單項(xiàng)1", self) # 創(chuàng)建菜單項(xiàng)self.action1.setShortcut("Ctrl+B") # 設(shè)置快捷鍵self.action2 = QAction("菜單項(xiàng)2", self)self.menu.addSeparator() # 創(chuàng)建分割線# 添加自定義菜單項(xiàng)self.addAction(self.action1) # 將菜單項(xiàng)添加到部件的主體中,用以生效快捷方式self.menu.addAction(self.action1) # 將菜單項(xiàng)添加到菜單中self.menu.addAction(self.action2)# 連接信號(hào)和槽函數(shù)self.action1.triggered.connect(self.on_action1_triggered)self.action2.triggered.connect(self.on_action2_triggered)# 重寫(xiě)上下文菜單事件def contextMenuEvent(self, event):# 顯示菜單self.menu.exec(event.globalPos())def on_action1_triggered(self):print("菜單項(xiàng)1被點(diǎn)擊")def on_action2_triggered(self):print("菜單項(xiàng)2被點(diǎn)擊")if __name__ == "__main__":app = QApplication(sys.argv)line_edit = MyLineEdit()line_edit.show()sys.exit(app.exec())
????這里注意,只有執(zhí)行了:self.addAction(self.action1),將菜單項(xiàng)添加到部件的主體中,才能生效快捷方式。而self.menu.addAction(self.action1)只是將菜單項(xiàng)添加到菜單中,并未在部件中注冊(cè)菜單項(xiàng)。
除了重新定義contextMenuEvent(),還有另一種更為靈活的方法:
? 使用策略設(shè)置setContextMenuPolicy()的方法來(lái)定義菜單:
PyQT(PySide)的上下文菜單策略設(shè)置setContextMenuPolicy()-CSDN博客