????????在 PySide中,contextMenuEvent()
?是?QWidget
?類(以及繼承自它的所有子類)的一個事件處理方法,主要用于處理上下文菜單事件,也就是當用戶在控件上右鍵點擊時觸發的事件。
? 通過重新定義contextMenuEvent()來實現自定義的鼠標右鍵菜單
from PySide6.QtGui import QAction
from PySide6.QtWidgets import QApplication, QWidget, QMenu
from PySide6.QtCore import Qtclass MyWidget(QWidget):def __init__(self):super().__init__()# 創建一個菜單self.menu = QMenu(self)# 創建菜單項action1 = QAction("菜單項1", self)action2 = QAction("菜單項2", self)# 將菜單項添加到菜單中self.menu.addAction(action1)self.menu.addAction(action2)# 連接信號和槽,定義點擊菜單項后的行為action1.triggered.connect(self.on_action1_triggered)action2.triggered.connect(self.on_action2_triggered)def contextMenuEvent(self, event):# 在鼠標點擊的位置顯示菜單self.menu.exec(event.globalPos())def on_action1_triggered(self):print("菜單項1被觸發")def on_action2_triggered(self):print("菜單項2被觸發")# 應用程序執行部分
if __name__ == "__main__":app = QApplication([])widget = MyWidget()widget.show()app.exec()
?? 將其定義在子部件內:
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("右鍵點擊我")# 創建一個菜單self.menu = QMenu(self)# 創建菜單項action1 = QAction("菜單項1", self)action2 = QAction("菜單項2", self)# 將菜單項添加到菜單中self.menu.addAction(action1)self.menu.addAction(action2)# 連接信號和槽,定義點擊菜單項后的行為action1.triggered.connect(self.on_action1_triggered)action2.triggered.connect(self.on_action2_triggered)def contextMenuEvent(self, event):# 在鼠標點擊的位置顯示菜單self.menu.exec(event.globalPos())def on_action1_triggered(self):print("菜單項1被觸發")def on_action2_triggered(self):print("菜單項2被觸發")# 應用程序執行部分
if __name__ == "__main__":app = QApplication([])widget = MyWidget()widget.show()app.exec()
上述代碼,只有在按鈕上有鼠標右鍵菜單。?
? 獲取系統默認的右鍵菜單并添加新的菜單項?
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("右鍵點擊我")self.menu = QMenu(self) # 創建一個菜單self.addMenus() # 添加菜單的菜單項def addMenus(self):# 獲取系統默認的上下文菜單動作default_actions = self.createStandardContextMenu().actions()# 將默認動作添加到新菜單中for action in default_actions:print(action.text())self.menu.addAction(action)# 將新的菜單項添加到新菜單中self.action1 = QAction("菜單項1", self)self.action2 = QAction("菜單項2", self)self.menu.addSeparator() # 創建分割線# 添加自定義菜單項self.menu.addAction(self.action1)self.menu.addAction(self.action2)# 連接信號和槽函數self.action1.triggered.connect(self.on_action1_triggered)self.action2.triggered.connect(self.on_action2_triggered)# 重寫上下文菜單事件def contextMenuEvent(self, event):# 顯示菜單self.menu.exec(event.globalPos())def on_action1_triggered(self):print("菜單項1被點擊")def on_action2_triggered(self):print("菜單項2被點擊")if __name__ == "__main__":app = QApplication(sys.argv)line_edit = MyLineEdit()line_edit.show()sys.exit(app.exec())
????????上面的代碼,讀取了系統內置的默認右鍵菜單,并增加了兩個自定義的菜單項,構成了一個新的菜單。重寫了contextMenuEvent(),使其顯示新的菜單。
?? 為新菜單設置快捷方式
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("右鍵點擊我")self.menu = QMenu(self) # 創建一個菜單self.addMenus() # 添加菜單的菜單項def addMenus(self):# 獲取系統默認的上下文菜單動作default_actions = self.createStandardContextMenu().actions()# 將默認動作添加到新菜單中for action in default_actions:self.menu.addAction(action)# 將新的菜單項添加到新菜單中self.action1 = QAction("菜單項1", self) # 創建菜單項self.action1.setShortcut("Ctrl+B") # 設置快捷鍵self.action2 = QAction("菜單項2", self)self.menu.addSeparator() # 創建分割線# 添加自定義菜單項self.addAction(self.action1) # 將菜單項添加到部件的主體中,用以生效快捷方式self.menu.addAction(self.action1) # 將菜單項添加到菜單中self.menu.addAction(self.action2)# 連接信號和槽函數self.action1.triggered.connect(self.on_action1_triggered)self.action2.triggered.connect(self.on_action2_triggered)# 重寫上下文菜單事件def contextMenuEvent(self, event):# 顯示菜單self.menu.exec(event.globalPos())def on_action1_triggered(self):print("菜單項1被點擊")def on_action2_triggered(self):print("菜單項2被點擊")if __name__ == "__main__":app = QApplication(sys.argv)line_edit = MyLineEdit()line_edit.show()sys.exit(app.exec())
????這里注意,只有執行了:self.addAction(self.action1),將菜單項添加到部件的主體中,才能生效快捷方式。而self.menu.addAction(self.action1)只是將菜單項添加到菜單中,并未在部件中注冊菜單項。
? 使用策略設置setContextMenuPolicy()的方法來定義菜單:
PyQT(PySide)的上下文菜單策略設置setContextMenuPolicy()-CSDN博客