PyQT(PySide)的上下文菜單策略設置setContextMenuPolicy()

????????在 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博客

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/896819.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/896819.shtml
英文地址,請注明出處:http://en.pswp.cn/news/896819.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

快慢指針【等分鏈表、判斷鏈表中是否存在環】

一、等分鏈表:找到鏈表的中間節點 Java 實現 class ListNode {int val;ListNode next;ListNode(int val) {this.val val;this.next null;} }public class MiddleOfLinkedList {public ListNode findMiddleNode(ListNode head) {if (head null) {return null;}L…

系統架構設計師—計算機基礎篇—計算機網絡

文章目錄 網絡互聯模型網絡協議與標準應用層協議FTP協議TFTP協議 HTTP協議HTTPS協議 DHCP動態主機配置協議DNS協議迭代查詢遞歸查詢 傳輸層協議網絡層協議IPV4協議IPV6協議IPV6數據報的目的地址IPV4到IPV6的過渡技術 網絡設計分層設計接入層匯聚層核心層 網絡布線綜合布線系統工…

計算機基礎面試(操作系統)

操作系統 1. 什么是進程和線程?它們的核心區別是什么? 專業解答: 進程是操作系統分配資源的基本單位,擁有獨立的內存空間;線程是進程內的執行單元,共享同一進程的資源。區別在于:進程間資源隔離…

考研408數據結構線性表核心知識點與易錯點詳解(附真題示例與避坑指南)

一、線性表基礎概念 1.1 定義與分類 定義:線性表是由n(n≥0)個相同類型數據元素構成的有限序列,元素間呈線性關系。 分類: 順序表:元素按邏輯順序存儲在一段連續的物理空間中(數組實現&…

【實戰 ES】實戰 Elasticsearch:快速上手與深度實踐-1.2.2倒排索引原理與分詞器(Analyzer)

👉 點擊關注不迷路 👉 點擊關注不迷路 👉 點擊關注不迷路 文章大綱 1.2.2倒排索引原理與分詞器(Analyzer)1. 倒排索引:搜索引擎的基石1.1 正排索引 vs 倒排索引示例數據對比: 1.2 倒排索引核心結…

Springboot項目本地連接并操作MySQL數據庫

目錄 前提 準備工作 用cmd在本地創建數據庫、表: 1.創建springboot項目(已有可跳過) 2.編輯Mybatis配置 3.連接數據庫 4.創建模型類,用于與數據庫里的數據表相連 5.創建接口mapper,定義對數據庫的操作 6.創建…

《寶塔 Nginx SSL 端口管理實戰指南:域名解析、端口沖突與后端代理解析》

📢 Nginx & SSL 端口管理分析 1?? 域名解析與 SSL 申請失敗分析 在使用寶塔申請 www.mywebsite.test 的 SSL 證書時,遇到了解析失敗的問題。最初,我認為 www 只是一個附加的前綴,不屬于域名的關鍵部分,因此只為…

java和Springboot和vue開發的企業批量排班系統人臉識別考勤打卡系統

演示視頻: https://www.bilibili.com/video/BV1KU9iYsEBU/?spm_id_from888.80997.embed_other.whitelist&t52.095574&bvidBV1KU9iYsEBU 主要功能: 管理員管理員工,采集員工人臉特征值存入數據庫,可選擇多個員工批量排班…

DeepSeek學習規劃

DeepSeek是一個專注于深度學習和人工智能技術研究與應用的平臺,旨在通過系統化的學習和實踐,幫助用戶掌握深度學習領域的核心知識和技能。為了在DeepSeek平臺上高效學習,制定一個科學合理的學習規劃至關重要。以下是一個詳細的學習規劃&#…

打開 Windows Docker Desktop 出現 Docker Engine Stopped 問題

一、關聯文章: 1、Docker Desktop 安裝使用教程 2、家庭版 Windows 安裝 Docker 沒有 Hyper-V 問題 3、安裝 Windows Docker Desktop - WSL問題 二、問題解析 打開 Docker Desktop 出現問題,如下: Docker Engine Stopped : Docker引擎停止三、解決方法 1、檢查服務是否…

突破Ajax跨域困境,解鎖前端通信新姿勢

一、引言 在當今的 Web 開發領域,前后端分離的架構模式已經成為主流,它極大地提升了開發效率和項目的可維護性。在這種開發模式下,前端通過 Ajax 技術與后端進行數據交互,然而,跨域問題卻如影隨形,成為了開…

Mercury、LLaDA 擴散大語言模型

LLaDA 參考: https://github.com/ML-GSAI/LLaDA https://ml-gsai.github.io/LLaDA-demo/ 在線demo: https://huggingface.co/spaces/multimodalart/LLaDA Mercury 在線demo: https://chat.inceptionlabs.ai/ 速度很快生成

Rust~String、str、str、String、Box<str> 或 Box<str>

Rust語言圣經中定義 str Rust 語言類型大致分為兩種:基本類型和標準庫類型,前者由語言特性直接提供,后者在標準庫中定義 str 是唯一定義在 Rust 語言特性中的字符串,但也是幾乎不會用到的字符串類型 str 字符串是 DST 動態大小…

大數據SQL調優專題——底層調優

引入 上一篇我們提到了調優的常見切入點,核心就是通過數據產出情況發現問題,借助監控等手段收集信息排查瓶頸在哪,最后結合業務理解,等價重寫思路去解決問題。 在實際工作場景中,去保證數據鏈路產出SLA的時候&#x…

Hue 編譯異常:ImportError: cannot import name ‘six‘ from ‘urllib3.packages‘

個人博客地址:Hue 編譯異常:ImportError: cannot import name six from urllib3.packages | 一張假鈔的真實世界 在編譯Hue的時候出現錯誤信息如下: Running /home/zhangjc/ysten/git/ysten-hue/build/env/bin/hue makemigrations --noinpu…

計算機網絡——詳解TCP三握四揮

文章目錄 前言一、三次握手1.1 三次握手流程1.2 tcp為什么需要三次握手建立連接? 二、四次揮手2.1 四次揮手流程2.2 為什么是四次,不是三次?2.3 為什么要等待2msl?2.4 TCP的保活計時器 前言 TCP和UDP是計算機網絡結構中運輸層的兩…

# C# 中堆(Heap)與棧(Stack)的區別

在 C# 中,堆和棧是兩種不同的內存分配機制,它們在存儲位置、生命周期、性能和用途上存在顯著差異。理解堆和棧的區別對于優化代碼性能和內存管理至關重要。 1. 棧(Stack) 1.1 定義 棧是一種后進先出(LIFO&#xff0…

如何把圖片或者圖片地址存到 MySQL 數據庫中以及如何將這些圖片數據通過 JSP 顯示在網頁中

如何優雅地管理圖片:從MySQL數據庫存儲到JSP展示的全流程解析 在互聯網時代,一張引人入勝的圖片往往能為網站帶來巨大的流量。而作為開發者的我們,如何高效地管理和展示這些圖片資源則成為了一項重要的技術挑戰。今天,我們就一起…

「拼好幀」小黃鴨 Lossless Scaling 軟件介紹與下載

「拼好幀」小黃鴨 Lossless Scaling 軟件介紹與下載 在游戲和視頻播放時,你是否遇到過分辨率不匹配、畫質模糊的問題?今天給大家介紹一款神器——Lossless Scaling(拼好幀),也被玩家們親切地稱為“小黃鴨”&#xff0…

科普|無人機專業術語

文章目錄 前言一、飛控二、電調三、通道四、2S、3S、4S電池五、電池后面C是什么意思?六、電機的型號七、什么是電機的KV值?八、螺旋槳的型號九、電機與螺旋槳的搭配 前言 無人機飛控系統控制飛行姿態,電調控制電機轉速,遙控器通道控制飛行動作。電池C…