????????本文講的是如何在PyQt5的組件QGraphicsView中重寫(xiě)鼠標(biāo)事件實(shí)現(xiàn)圖片的移動(dòng)。
????????PyQt5作為強(qiáng)大的GUI編程工具,免不了會(huì)拿來(lái)做一些圖片的顯示和處理問(wèn)題,有的會(huì)使用QPainter作為動(dòng)態(tài)顯示圖片的工具,QLabel是顯示靜態(tài)圖片的主推。但是我在工作中遇到了超大tiff圖片的處理,一次顯示1G大小的圖片進(jìn)行灰度變換與標(biāo)記等工作,這就需要專(zhuān)業(yè)的圖片處理Qt的QGraphicsView模塊。
????????QGraphicsView專(zhuān)業(yè)到已經(jīng)封裝好了一個(gè)鼠標(biāo)移動(dòng)事件,也就是一句代碼:
????????
self.ui.graphicsView.setDragMode(QGraphicsView.ScrollerHandDrag)
? ? ? ??elf.ui.graphicsView是我的類(lèi)里面的一個(gè)QGraphicsView的窗口,你們自己的類(lèi)里面自己命名的QGraphicsView換一下對(duì)應(yīng)的名字就行。
? ? ? ? 但是這個(gè)函數(shù)由于是封裝好的,已經(jīng)占用了mousePressEvent、mouseMoveEvent、mouseReleaseEvent三個(gè)方法,這就導(dǎo)致一個(gè)很令人難受的結(jié)果,你要是使用拖動(dòng)效果,就只能實(shí)現(xiàn)拖動(dòng)效果,自定義任意一個(gè)鼠標(biāo)事件都會(huì)到時(shí)這句代碼的效果失效。沒(méi)辦法,為了實(shí)現(xiàn)更多的功能,我們要重寫(xiě)移動(dòng)事件。
# -*- coding: utf-8 -*-
"""
@author:xiaoyangchicao2020
@time:2022-99-99
"""
self.imgopened = False
self.leftpressed = False
self.scalenum = 5
def mouse_press(self, event):
button = event.button()
if button == qc.Qt.LeftButton:
self.leftpressed = True
self.startpos = self.ui.graphicsView.mapToScene(event.pos())
def mouse_move(self,event):
if self.leftpressed ==True:
self.endpos = self.ui.graphicsView.mapToScene(event.pos())
oposx = self.ui.graphicsView.horizontalScrollBar().value()
oposy = self.ui.graphicsView.verticalScrollBar().value()
offset = self.endpos - self.startpos
nposx = oposx - offset.x() * self.scalenum
nposy = oposy - offset.y() * self.scalenum
self.ui.graphicsView.horizontalScrollBar().setValue(nposx)
self.ui.graphicsView.verticalScrollBar().setValue(nposy)
def mouse_release(self, event):
button = event.button()
if button == qc.Qt.LeftButton:
self.leftpressed = False
? ? ? ? 鼠標(biāo)事件包含三個(gè)子事件,很不錯(cuò)的是,所有事件都可由通過(guò)event參數(shù)來(lái)調(diào)用和返回,這就提供了我們自定義函數(shù)的很大的空間。
? ? ? ? 下面是代碼的解釋。
????????先是mousePressEvent,按下的時(shí)候會(huì)發(fā)生什么。我在上面定義了是否按下的一個(gè)布爾值,只有在左鍵點(diǎn)擊之后變?yōu)門(mén)rue才能進(jìn)行下面代碼的操作。這個(gè)時(shí)候返回現(xiàn)在鼠標(biāo)點(diǎn)擊的坐標(biāo),為了后續(xù)操作打基礎(chǔ)。
? ? ? ? 再是移動(dòng)事件,為了使移動(dòng)變得順暢,我們每移動(dòng)一次鼠標(biāo)就要進(jìn)行一次圖片的重繪,而重繪的偏移量就是鼠標(biāo)結(jié)束坐標(biāo)減去鼠標(biāo)的開(kāi)始坐標(biāo),這樣,在按下左鍵之后,只要鼠標(biāo)移動(dòng),就一直重繪。
? ? ? ? 最后是結(jié)束事件,開(kāi)始的時(shí)候bool值變成了True,那么鼠標(biāo)釋放的時(shí)候就要改成False,不然等你放松之后,依然會(huì)保持按住的情況松不開(kāi)。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-413269.html
? ? ? ? 參數(shù)解釋?zhuān)旧献兞棵帜鼐鸵呀?jīng)給出了解釋?zhuān)恍枰⒁鈓apToScene(event.pos())、horizontalScrollBar().value()、verticalScrollBar().value()三個(gè)方法的含義就行,去看官方文檔,如果你嫌麻煩就是把self.ui.graphicsView改成你的類(lèi)里面的那個(gè)QGraphicsView的名字就行。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-413269.html
到了這里,關(guān)于QGraphicsView中重寫(xiě)鼠標(biāo)事件實(shí)現(xiàn)圖片的移動(dòng)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!