PySide(PyQt),使用types.MethodType動態定義事件

????????以PySide(PyQt)的圖片項為例,比如一個視窗的場景底圖是一個QGraphicsPixmapItem,需要修改它的鼠標滾輪事件,以實現鼠標滾輪縮放顯示的功能。為了達到這個目的,可以重新定義一個QGraphicsPixmapItem類,并重寫它的wheelEvent()函數:

class MyGraphicsPixmapItem(QGraphicsPixmapItem):def __init__(self, pixmap):super().__init__(pixmap)def wheelEvent(self, event):self.setScale(self.scale() * (1.001 ** event.delta()))

然后在代碼中實例化這個類就可以了,這沒有任何問題。

????????需求的提出:

????????首先,場景中只有這一個場景底圖,而且我僅僅只需要修改它的鼠標滾輪事件響應這個函數,為了這簡單的一個需求重建一個新的類,不是那么優雅。然后,鼠標滾輪縮放顯示的這個功能,我還想用到別的目標上,需要復用和方便移植。或者,鼠標滾輪的事件響應,我需要在程序中根據工況不同動態改變。為此,可以采用types.MethodType動態定義事件方法:

from PySide6.QtCore import Qt
from PySide6.QtGui import QPixmap
from PySide6.QtWidgets import QGraphicsScene, QGraphicsView, QApplication, QGraphicsPixmapItem, QGraphicsItem, \QGraphicsRectItem
import typesapp = QApplication([])# 鼠標滾輪縮放的功能(附加檢測shift鍵縮放)
def wheelZoom(graphics_item, event):if event.modifiers() & Qt.ShiftModifier:graphics_item.setScale(graphics_item.scale() * (1.001 ** event.delta()))# ############不檢測shift鍵縮放###############
# def wheelZoom(graphics_item, event):
#     graphics_item.setScale(graphics_item.scale() * (1.001 ** event.delta()))
# ##########################################
def hover_enter_event(graphics_item, event):print("鼠標進入")event.accept()def hover_leave_event(graphics_item, event):print("鼠標離開")event.accept()scene = QGraphicsScene()  # 創建場景對象
view = QGraphicsView(scene)  # 創建視圖對象# 設置場景并顯示
view.setScene(scene)
view.show()
pixmap = QPixmap("example.jpg")  # 加載圖片
pixmap_item = QGraphicsPixmapItem(pixmap)  # 創建圖片對象
scene.addItem(pixmap_item)  # 將圖片添加到場景中rect_item = QGraphicsRectItem(100,100,100,100)  # 創建一個矩形對象
scene.addItem(rect_item)  # 將矩形添加到場景中pixmap_item.setAcceptHoverEvents(True)  # 設置圖片接受鼠標事件
pixmap_item.wheelEvent = types.MethodType(wheelZoom, pixmap_item)  # 給圖像項添加滾輪縮放事件
rect_item.wheelEvent = types.MethodType(wheelZoom, rect_item)  # 給圖像項添加滾輪縮放事件
pixmap_item.hoverEnterEvent = types.MethodType(hover_enter_event, pixmap_item)  # 給圖像項添加鼠標進入事件
pixmap_item.hoverLeaveEvent = types.MethodType(hover_leave_event, pixmap_item)  # 給圖像項添加鼠標離開事件app.exec()
上面的代碼,定義了幾個方法,并且將其動態綁定到了圖片項的實例,實現了所需的功能。

types的更多學習筆記見:Python的types庫學習記錄-CSDN博客

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

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

相關文章

K8S學習之基礎三十一:k8s中RBAC 的核心概念

Kubernetes (k8s) 中的 RBAC(Role-Based Access Control,基于角色的訪問控制)是一種用于管理用戶和服務賬戶對集群資源訪問權限的機制。RBAC 允許管理員通過定義角色(Role)和角色綁定(RoleBinding&#xff…

【eNSP實戰】三層交換機使用ACL實現網絡安全

拓圖 要求: vlan1可以訪問Internetvlan2和vlan3不能訪問Internet和vlan1vlan2和vlan3之間可以互相訪問PC配置如圖所示,這里不展示 LSW1接口vlan配置 vlan batch 10 20 30 # interface Vlanif1ip address 192.168.40.2 255.255.255.0 # interface Vla…

軟考系統架構師 — 1 考點分析

目錄 1 考點總結 1 考點總結 章節 內容 真題考察 緒論 1. 緒論 不考 計算機相關知識 2. 計算機系統基礎知識,新增計算機硬件、嵌入式、計算機語言、系統工程 對應計算機組成結構、操作系統、數據庫、計算機網絡、多媒體等知識點,整體分值在 10 …

在Eclipse 中使用 MyBatis 進行開發,通常需要以下步驟:

在Eclipse 中使用 MyBatis 進行開發,通常需要以下步驟: 1. 創建 Maven 項目 首先,在 Eclipse 中創建一個 Maven 項目。如果你還沒有安裝 Maven 插件,可以通過 Eclipse Marketplace 安裝 Maven 插件。 打開 Eclipse,選…

錯誤記錄: git 無法連接到github

錯誤記錄: git 無法連接到github 今天, 新建了一個github倉庫, 但從本地怎么都push不上去.并報錯 gitgithub.com: Permission denied (publickey). fatal: Could not read from remote repository.Please make sure you have the correct access rights and the repository e…

k8s 配置兩個deployment主機級別互斥部署

在 Kubernetes 中,要實現兩個 Deployment 的 Pod 在主機級別互斥部署,可以使用 podAntiAffinity 配置。通過設置 podAntiAffinity,可以確保兩個 Deployment 的 Pod 不會被調度到同一節點上。 實現步驟 定義 Deployment: 為每個…

Unity中WolrdSpace下的UI展示在上層

一、問題描述 Unity 中 Canvas使用World Space布局的UI,想讓它不被3d物體遮擋,始終顯示在上層。 二、解決方案 使用shader解決 在 UI 的材質中禁用深度測試(ZTest),強制 UI 始終渲染在最上層。 Shader "Custo…

五子棋小游戲-簡單開發版

一、需求分析 開發一個基于 Pygame 庫的五子棋小游戲,允許兩名玩家在棋盤上輪流落子,當有一方達成五子連珠時游戲結束,顯示獲勝信息,并提供退出游戲和重新開始游戲的操作選項。 1.棋盤顯示 : 顯示一個 15x15 的五子棋…

基于C#的以太網通訊實現:TcpClient異步通訊詳解

基于C#的以太網通訊實現:TcpClient異步通訊詳解 在現代工業控制和物聯網應用中,以太網通訊是一種常見的數據傳輸方式。本文將介紹如何使用C#實現基于TCP協議的以太網通訊,并通過異步編程提高通訊效率。我們將使用TcpClient類來實現客戶端與服…

小秋的矩陣

0小秋的矩陣 - 藍橋云課 問題描述 給你一個 n 行 m 列只包含 0 和 1 的矩陣,求它的所有子矩陣中,是方陣而且恰好包含 k 個 0 的數量。 方陣是行數和列數相等的矩陣。 子矩陣是從一個矩陣當中選取某些行和某些列交叉位置所組成的新矩陣(保…

晶晨S905L3芯片_原機安卓4升級安卓9.0_通刷線刷固件包

晶晨S905L3芯片_原機安卓4升級安卓9.0_通刷線刷固件包 線刷方法:(新手參考借鑒一下) 1、準備好一根雙公頭USB線刷刷機線,長度30-50CM長度最佳,同時準備一臺電腦; 2、電腦上安裝好刷機工具Amlogic USB Bu…

麒麟服務器操作系統Redis部署手冊

軟件簡介 Redis****介紹 REmote DIctionary Server(Redis) 是一個由 Salvatore Sanfilippo 寫的 key-value 存儲系統,是跨平臺的非關系型數據庫。 Redis 是一個開源的使用 ANSI C 語言編寫、遵守 BSD 協議、支持網絡、可基于內存、分布式、可選持久性的鍵值對(Key-Value)存…

(分塊)洛谷 P2801 教主的魔法 題解

之前學過 莫隊 算法,其運用了分塊思想;但是我居然是第一次寫純種的分塊題目。 題意 給你一個長度為 n n n 的序列 a a a(一開始 ? a i ∈ [ 1 , 1000 ] \forall a_i\in[1,1000] ?ai?∈[1,1000])。要求執行 q q q 次操作&…

谷歌Chrome或微軟Edge瀏覽器修改網頁任意內容

在谷歌或微軟瀏覽器按F12,打開開發者工具,切換到console選項卡: 在下面的輸入行輸入下面的命令回車: document.body.contentEditable"true"效果如下:

【生日蛋糕——DFS剪枝優化】

題目 分析 代碼 #include <bits/stdc.h> using namespace std;const int N 24; const int inf 0x3f3f3f3f;int mins[N], minv[N]; int R[N], H[N]; int n, m, ans inf;void dfs(int u, int v, int s) {if(v minv[u] > n) return;if(s mins[u] > ans) return;…

【C++基礎十】泛型編程(模板初階)

【C基礎十】泛型編程—模板 1.什么是模板2.函數模板的實例化&#xff1a;2.1隱式實例化2.2顯示實例化 3.函數模板參數的匹配規則4.什么是類模板5.類模板的實例化6.聲明和定義分離 1.什么是模板 void swap(int& a, int& b) {int tmp 0;tmp a;a b;b tmp; }void swap…

如何修復 Tauri 發布后程序運行時顯示 `asset not found: index.html` 的問題

如何修復 Tauri 發布后程序運行時顯示 asset not found: index.html 的問題 在使用 Tauri 發布應用程序時&#xff0c;如果運行時出現 asset not found: index.html 的錯誤&#xff0c;通常是因為 Tauri 無法找到或正確加載前端資源文件&#xff08;如 index.html&#xff09;…

短視頻下載去水印,用什么工具好?

去除視頻和圖片水印是許多用戶的需求&#xff0c;尤其是在分享或保存內容時。以下是6款超好用的工具&#xff0c;幫助你輕松去除水印&#xff0c;享受純凈的視覺體驗&#xff1a; 1. 易下載去水印小程序 特點&#xff1a; 操作簡單&#xff0c;支持抖音、快手、小紅書、嗶哩嗶哩…

【華為OD-E卷 -121 消消樂游戲 100分(python、java、c++、js、c)】

【華為OD-E卷 - 消消樂游戲 100分(python、java、c++、js、c)】 題目 游戲規則:輸入一個只包含英文字母的字符串,字符串中的兩個字母如果相鄰且相同,就可以消除。 在字符串上反復執行消除的動作,直到無法繼續消除為止,此時游戲結束。 輸出最終得到的字符串長度 輸入描…

設計模式(行為型)-備忘錄模式

目錄 定義 類圖 角色 角色詳解 &#xff08;一&#xff09;發起人角色&#xff08;Originator&#xff09;? &#xff08;二&#xff09;備忘錄角色&#xff08;Memento&#xff09;? &#xff08;三&#xff09;備忘錄管理員角色&#xff08;Caretaker&#xff09;?…