PySide(PyQT)重新定義contextMenuEvent()實現鼠標右鍵彈出菜單

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

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

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

相關文章

GitHub SSH連接問題解決指南

🔍 GitHub SSH連接問題解決指南 問題描述 遇到錯誤:ssh: connect to host github.com port 22: Connection refused 說明您的網絡環境無法訪問GitHub的SSH端口22,常見原因: 防火墻/網絡運營商限制(國內常見&#xf…

Go紅隊開發—并發編程

文章目錄 并發編程go協程chan通道無緩沖通道有緩沖通道創建?緩沖和緩沖通道 等協程sync.WaitGroup同步Runtime包Gosched()Goexit() 區別 同步變量sync.Mutex互斥鎖atomic原子變量 SelectTicker定時器控制并發數量核心機制 并發編程階段練習重要的細節端口掃描股票監控 并發編程…

RabbitMQ 的介紹與使用

一. 簡介 1> 什么是MQ 消息隊列(Message Queue,簡稱MQ),從字面意思上看,本質是個隊列,FIFO先入先出,只不過隊列中存放的內容是message而已。 其主要用途:不同進程Process/線程T…

常用的AI文本大語言模型匯總

AI文本【大語言模型】 1、文心一言https://yiyan.baidu.com/ 2、海螺問問https://hailuoai.com/ 3、通義千問https://tongyi.aliyun.com/qianwen/ 4、KimiChat https://kimi.moonshot.cn/ 5、ChatGPThttps://chatgpt.com/ 6、魔塔GPT https://www.modelscope.cn/studios/iic…

在自己的數據上復現一下LlamaGen

git倉庫:https://github.com/FoundationVision/LlamaGen 數據集準備 如果用ImageFolder讀取,則最好和ImageNet一致。 data_path/class_1/image_001.jpgimage_002.jpg...class_2/image_003.jpgimage_004.jpg......class_n/image_005.jpgimage_006.jpg.…

Go入門之接口

type Usber interface {start()stop() } type Phone struct {Name string }func (p Phone) start() {fmt.Println(p.Name, "啟動") } func (p Phone) stop() {fmt.Println(p.Name, "關機") } func main() {p : Phone{Name: "華為手機",}var p1 U…

【數據結構進階】哈希表

🌟🌟作者主頁:ephemerals__ 🌟🌟所屬專欄:數據結構 目錄 前言 一、哈希表的概念 二、哈希函數的實現方法 1. 直接定址法 2. 除留余數法 三、哈希沖突 1. 開放定址法(閉散列&#xff0…

《深度學習實戰》第4集:Transformer 架構與自然語言處理(NLP)

《深度學習實戰》第4集:Transformer 架構與自然語言處理(NLP) 在自然語言處理(NLP)領域,Transformer 架構的出現徹底改變了傳統的序列建模方法。它不僅成為現代 NLP 的核心,還推動了諸如 BERT、…

高效管理 React 狀態和交互:我的自定義 Hooks 實踐

高效管理 React 狀態和交互:自定義 Hooks 實踐 在 React 中,Hooks 是一種使我們能夠在函數組件中使用狀態和副作用的強大工具。隨著項目的增大,重復的邏輯可能會出現在多個組件中,這時使用自定義 Hooks 就非常合適。它們幫助我們…

Exoplayer(MediaX)實現音頻變調和變速播放

在K歌或錄音類應用中變調是個常見需求,比如需要播出蘿莉音/大叔音等。變速播放在影視播放類應用中普遍存在,在傳統播放器Mediaplayer中這兩個功能都比較難以實現,特別在低版本SDK中,而Exoplayer作為google官方推出的Mediaplayer替…

Meta最新研究:從單張照片到3D數字人的革命性突破

隨著人工智能技術的發展,3D建模和虛擬人物生成逐漸變得更加普及和高效。Meta(前身為Facebook)的最新研究成果展示了如何僅通過一張普通手機拍攝的照片就能生成高質量、全方位的3D數字人。這項技術不僅適用于虛擬試衣、游戲角色建模,還能廣泛應用于AR/VR內容生成等領域。本文…

軟件供應鏈安全工具鏈研究系列——RASP自適應威脅免疫平臺(上篇)

1.1 基本能力 RASP是一種安全防護技術,運行在程序執行期間,使程序能夠自我監控和識別有害的輸入和行為。也就是說一個程序如果注入或者引入了RASP技術,那么RASP就和這個程序融為一體,使應用程序具備了自我防護的能力,…

2025-02-27 學習記錄--C/C++-PTA 7-29 刪除字符串中的子串

合抱之木&#xff0c;生于毫末&#xff1b;九層之臺&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; 一、題目描述 ?? 二、代碼&#xff08;C語言&#xff09;?? #include <stdio.h> // 引入標準輸入輸出庫&#xff0c…

Redis---字符串SDS(簡單動態字符串)底層結構

文章目錄 什么是SDS&#xff08;簡單動態字符串&#xff09;SDS結構SDS的優點O(1) 時間復雜度獲取字符串長度避免緩沖區溢出減少內存重分配次數二進制安全兼容C語言字符串函數 SDS的操作總結 什么是SDS&#xff08;簡單動態字符串&#xff09; redis是由C語言編寫的&#xff0…

Elasticsearch:使用阿里云 AI 服務進行嵌入和重新排名

作者&#xff1a;來自 Elastic Toms Mura 將阿里云 AI 服務功能與 Elastic 結合使用。 更多閱讀&#xff0c;請參閱 “Elasticsearch&#xff1a;使用阿里 infererence API 及 semantic text 進行向量搜索”。 在本文中&#xff0c;我們將介紹如何將阿里云 AI 功能與 Elastics…

Spring Cloud Alibaba與Spring Boot、Spring Cloud版本對應關系

一、前言 在搭建SpringCloud項目環境架構的時候&#xff0c;需要選擇SpringBoot和SpringCloud進行兼容的版本號&#xff0c;因此對于選擇SpringBoot版本與SpringCloud版本的對應關系很重要&#xff0c;如果版本關系不對應&#xff0c;常見的會遇見項目啟動不起來&#xff0c;怪…

【含文檔+PPT+源碼】基于過濾協同算法的旅游推薦管理系統設計與實現

項目介紹 本課程演示的是一款基于過濾協同算法的旅游推薦管理系統設計與實現&#xff0c;主要針對計算機相關專業的正在做畢設的學生與需要項目實戰練習的 Java 學習者。 1.包含&#xff1a;項目源碼、項目文檔、數據庫腳本、軟件工具等所有資料 2.帶你從零開始部署運行本套…

MTK Android12 預裝apk可卸載

文章目錄 需求解決方法1、device/mediatek/mt6761/device.mk2、/vendor/mediatek/proprietary/frameworks/base/data/etc/pms_sysapp_removable_vendor_list.txt3、路徑&#xff1a;4、Android.mk 需求 近期&#xff0c;客戶需要預裝一個apk&#xff0c;同時該apk要可卸載。解…

從 0 到 1,用 Python 構建超實用 Web 實時聊天應用

從 0 到 1&#xff0c;用 Python 構建超實用 Web 實時聊天應用 本文深入剖析如何運用 Python 的 Flask 框架與 SocketIO 擴展&#xff0c;搭建一個功能完備的 Web 實時聊天應用。從環境搭建、前后端代碼實現&#xff0c;到最終運行展示&#xff0c;逐步拆解關鍵步驟&#xff0…

視頻字幕識別和翻譯

下載的視頻很多不是漢語的&#xff0c;我們需要用剪映將語音識別出來作為字幕壓制到視頻中去。 剪映6.0以后語音識別需要收費&#xff0c;但是低版本還是沒有問題。 如果想要非漢語字幕轉成中文&#xff0c;剪映低版本不提供這樣功能。但是&#xff0c;用剪映導出識別字幕&am…