????????在 Qt 中,QWidget
?類提供了幾種不同的上下文菜單策略,這些策略通過?Qt::ContextMenuPolicy
?枚舉類型來定義,用于控制控件(如按鈕、文本框等)在用戶右鍵點擊時如何顯示上下文菜單。
????????以下是?Qt::ContextMenuPolicy
?枚舉中定義的所有上下文菜單策略:
1.?Qt::DefaultContextMenu
- 含義:使用默認的上下文菜單處理方式。對于大多數控件,這通常意味著當用戶右鍵點擊時,會根據操作系統和控件的默認行為顯示一個上下文菜單。
- 示例代碼:
import sysfrom PySide6.QtCore import Qt
from PySide6.QtWidgets import QApplication, QWidget, QLineEditapp = QApplication(sys.argv)
window = QWidget()line_edit = QLineEdit("DefaultContextMenu", window)
line_edit.setContextMenuPolicy(Qt.DefaultContextMenu)window.show()
sys.exit(app.exec())
? 當單擊鼠標右鍵,彈出默認的菜單。
2.?Qt::NoContextMenu
- 含義:控件不會顯示上下文菜單。當用戶在該控件上右鍵點擊時,不會觸發任何與上下文菜單相關的操作。注意:該策略只是簡單地讓控件自身不顯示上下文菜單,但當用戶在這個控件上觸發上下文菜單事件(通常是右鍵點擊)時,這個事件會繼續向其父控件傳播。如果父控件有相應的上下文菜單處理邏輯,那么父控件的上下文菜單可能會顯示出來。
- 示例代碼:
import sysfrom PySide6.QtCore import Qt
from PySide6.QtWidgets import QApplication, QWidget, QLineEditapp = QApplication(sys.argv)
window = QWidget()line_edit = QLineEdit("No Context Menu", window)
line_edit.setContextMenuPolicy(Qt.NoContextMenu)window.show()
sys.exit(app.exec())
3.?Qt::PreventContextMenu
- 含義:阻止上下文菜單的顯示,并且不會向父控件傳播上下文菜單事件。這意味著即使父控件有上下文菜單處理邏輯,也不會被觸發。
- 示例代碼:
import sysfrom PySide6.QtCore import Qt
from PySide6.QtGui import QAction
from PySide6.QtWidgets import QApplication, QWidget, QLineEdit, QMenuapp = QApplication(sys.argv)class MyWindow(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.setWindowTitle("上下文菜單")self.resize(300, 200)# 重寫上下文菜單事件def contextMenuEvent(self, event):# 創建一個菜單menu = QMenu(self)# 創建菜單項action1 = QAction("菜單項1", self)action2 = QAction("菜單項2", self)# 將菜單項添加到菜單中menu.addAction(action1)menu.addAction(action2)# 在鼠標點擊的位置顯示菜單menu.exec(event.globalPos())window = MyWindow()
line_edit = QLineEdit("PreventContextMenu", window)
line_edit.setContextMenuPolicy(Qt.PreventContextMenu)window.show()
sys.exit(app.exec())
????????這個范例中,由于line_edit設置了PreventContextMenu
策略,雖然它的父容器定義了菜單,但是阻止了向父控件傳播上下文菜單事件,所以點擊它沒有任何菜單顯示。
如果將上述代碼修改為DefaultContextMenu策略:
import sysfrom PySide6.QtCore import Qt
from PySide6.QtGui import QAction
from PySide6.QtWidgets import QApplication, QWidget, QLineEdit, QMenuapp = QApplication(sys.argv)class MyWindow(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.setWindowTitle("上下文菜單")self.resize(300, 200)# 重寫上下文菜單事件def contextMenuEvent(self, event):# 創建一個菜單menu = QMenu(self)# 創建菜單項action1 = QAction("菜單項1", self)action2 = QAction("菜單項2", self)# 將菜單項添加到菜單中menu.addAction(action1)menu.addAction(action2)# 在鼠標點擊的位置顯示菜單menu.exec(event.globalPos())window = MyWindow()
line_edit = QLineEdit("PreventContextMenu", window)
line_edit.setContextMenuPolicy(Qt.DefaultContextMenu)window.show()
sys.exit(app.exec())
它就會顯示自己的默認菜單。
?或者設置為NoContextMenu
策略:
import sysfrom PySide6.QtCore import Qt
from PySide6.QtGui import QAction
from PySide6.QtWidgets import QApplication, QWidget, QLineEdit, QMenuapp = QApplication(sys.argv)class MyWindow(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.setWindowTitle("上下文菜單")self.resize(300, 200)# 重寫上下文菜單事件def contextMenuEvent(self, event):# 創建一個菜單menu = QMenu(self)# 創建菜單項action1 = QAction("菜單項1", self)action2 = QAction("菜單項2", self)# 將菜單項添加到菜單中menu.addAction(action1)menu.addAction(action2)# 在鼠標點擊的位置顯示菜單menu.exec(event.globalPos())window = MyWindow()
line_edit = QLineEdit("PreventContextMenu", window)
line_edit.setContextMenuPolicy(Qt.NoContextMenu)window.show()
sys.exit(app.exec())
?點擊后自己的菜單不顯示,但是將點擊事件傳遞給了父容器,所以會顯示父容器的菜單:
4.?Qt::ActionsContextMenu
- 含義:控件的上下文菜單由其?
actions()
?方法返回的動作列表組成。可以通過向控件添加動作(QAction
)來定義上下文菜單的選項。 - 示例代碼:
import sysfrom PySide6.QtCore import Qt
from PySide6.QtGui import QAction
from PySide6.QtWidgets import QApplication, QWidget, QPushButton, QLineEditapp = QApplication(sys.argv)
window = QWidget()class MyLineEdit(QLineEdit):def __init__(self, parent=None):super().__init__(parent)self.setupUi(self)def setupUi(self, parent):self.setText("PreventContextMenu")self.setContextMenuPolicy(Qt.ActionsContextMenu) # 設置上下文菜單策略action = QAction("Action 1", self)self.addAction(action) # 創建的時候已經有了Action 1菜單項line_edit = MyLineEdit(window)action = QAction("Action 2", line_edit)
line_edit.addAction(action) # 再添加一個Action 2菜單項window.show()
sys.exit(app.exec())
進一步的,我們可以讀取控件的系統內置默認菜單,并且再后面加上自定義的菜單項:
import sysfrom PySide6.QtCore import Qt
from PySide6.QtGui import QAction
from PySide6.QtWidgets import QApplication, QWidget, QPushButton, QLineEditapp = QApplication(sys.argv)
window = QWidget()class MyLineEdit(QLineEdit):def __init__(self, parent=None):super().__init__(parent)self.setupUi(self)def setupUi(self, parent):self.setText("ActionsContextMenu")self.setContextMenuPolicy(Qt.ActionsContextMenu) # 設置上下文菜單策略default_actions = self.createStandardContextMenu().actions() # 獲取系統默認的上下文菜單self.addActions(default_actions) # 添加系統默認的上下文菜單action = QAction("Action 1", self) # 創建一個Action 1菜單項self.addAction(action) # 添加Action 1菜單項line_edit = MyLineEdit(window)action = QAction("Action 2", line_edit)
line_edit.addAction(action) # 再添加一個Action 2菜單項window.show()
sys.exit(app.exec())
5.?Qt::CustomContextMenu
- 含義:自定義上下文菜單。
????????當用戶在控件上右鍵點擊時,會發出?customContextMenuRequested
?信號,開發者可以連接這個信號到自定義的槽函數,在槽函數中創建并顯示自定義的上下文菜單。 - 示例代碼:
import sysfrom PySide6.QtCore import Qt
from PySide6.QtWidgets import QApplication, QWidget, QMenu, QLineEditapp = QApplication(sys.argv)
window = QWidget()line_edit = QLineEdit("PreventContextMenu", window)
line_edit.setContextMenuPolicy(Qt.CustomContextMenu) # 設置上下文菜單策略# 槽函數
def show_context_menu(pos):menu = QMenu(line_edit)menu.addAction("Custom Action")menu.exec(line_edit.mapToGlobal(pos))line_edit.customContextMenuRequested.connect(show_context_menu) # 連接信號和槽window.show()
sys.exit(app.exec())
除了策略設置setContextMenuPolicy()的方法,還可以使用另一種方法:
通過重新定義contextMenuEvent()?的方法來定義右鍵菜單
PySide(PyQT)重新定義contextMenuEvent()實現鼠標右鍵彈出菜單-CSDN博客