日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

使用 PyQt5 实现图片查看器

發(fā)布時(shí)間:2023/12/15 综合教程 35 生活家
生活随笔 收集整理的這篇文章主要介紹了 使用 PyQt5 实现图片查看器 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、前言

  在學(xué)習(xí) PyQt5 的過程中我會不斷地做一些小的 Demo,用于讓自己能夠更好地理解和學(xué)習(xí),這次要做的就是一個(gè)圖片查看器,主要功能包括打開圖片、拖動圖片、放大和縮小圖片。

  最終實(shí)現(xiàn)的圖片查看器你效果如下:

  

二、主要步驟  

1.顯示圖片

  PyQt5 繪圖系統(tǒng)能渲染矢量圖像、位圖圖像和輪廓字體文本。一般會使用在修改或者提高現(xiàn)有組件的功能,或者創(chuàng)建自己的組件,使用 PyQt5 的繪圖 API 進(jìn)行操作。在 Qt 中有 QPainter 類用于執(zhí)行繪制的操作,繪圖由 paintEvent() 來完成,繪圖的代碼要放在 QPainter 對象的 start() 和 end() 方法之間。

  要將圖片顯示出來,首先是繼承 QWidget,然后實(shí)現(xiàn) paintEvent() 方法,主要是使用 drawPixmap() 方法,需要傳入 QPixmap 對象并將其繪制出來,繪圖的代碼如下:

 1 def paintEvent(self, e):
 2     """
 3     receive paint events
 4     :param e: QPaintEvent
 5     :return:
 6     """
 7     if self.scaled_img:
 8         painter = QPainter()
 9         painter.begin(self)
10         painter.drawPixmap(self.point, self.scaled_img)
11         painter.end()

2.拖動圖片

  在圖片成功顯示出來之后,需要能夠去拖動圖片,以便于查看圖片的每個(gè)角落,主要得實(shí)現(xiàn)三個(gè)方法:mouseMoveEvent、mousePressEvent 和 mouseReleaseEvent,分別對應(yīng)移動鼠標(biāo)、點(diǎn)擊鼠標(biāo)和松開鼠標(biāo)三個(gè)事件。

  思路是獲取鼠標(biāo)點(diǎn)擊時(shí)的位置,然后根據(jù)鼠標(biāo)位置的變化來計(jì)算圖片需要移動的距離,再移動圖片就行了。具體代碼如下:

 1 def mouseMoveEvent(self, e):
 2     """
 3     mouse move events for the widget
 4     :param e: QMouseEvent
 5     :return:
 6     """
 7     if self.left_click:
 8         self.end_pos = e.pos() - self.start_pos
 9         self.point = self.point + self.end_pos
10         self.start_pos = e.pos()
11         self.repaint()
12 
13 def mousePressEvent(self, e):
14     """
15     mouse press events for the widget
16     :param e: QMouseEvent
17     :return:
18     """
19     if e.button() == Qt.LeftButton:
20         self.left_click = True
21         self.start_pos = e.pos()
22 
23 def mouseReleaseEvent(self, e):
24     """
25     mouse release events for the widget
26     :param e: QMouseEvent
27     :return:
28     """
29     if e.button() == Qt.LeftButton:
30         self.left_click = False

3.打開文件

  有時(shí)候我們會想打開本地的文件進(jìn)行查看,所以還要實(shí)現(xiàn)一個(gè)打開文件的功能。而要實(shí)現(xiàn)這一功能,可以用 QFileDialog 類來實(shí)現(xiàn),該類里有一個(gè) getOpenFileName() 方法,使用該方法能夠打開本地路徑并選擇符合文件要求格式的文件,例如使用“*.png”就支持打開所有 png 格式的圖片文件,而不支持其他格式的文件。

  getOpenFileName()方法有兩個(gè)返回值,第一個(gè)返回值是所選擇的文件的路徑,第二個(gè)返回值是文件類型,得到文件路徑后就能創(chuàng)建一個(gè) QPixmap 對象,再使用前面顯示圖片的方法進(jìn)行顯示,具體代碼如下:

1 def open_image(self):
2     """
3     select image file and open it
4     :return:
5     """
6     img_name, _ = QFileDialog.getOpenFileName(self, "Open Image File", "*.jpg;;*.png;;*.jpeg")
7     self.box.set_image(img_name)

4.放大縮小圖片

  在查看圖片的時(shí)候,有時(shí)候會需要放大了觀看圖片的某些細(xì)節(jié)部分,因而需要實(shí)現(xiàn)放大和縮小圖片的功能,所以做了兩個(gè)按鈕分別用于放大圖片和縮小圖片。

  在 QPainter 中,可以根據(jù) QPainter 的坐標(biāo)系進(jìn)行各種變換,例如平移(translate)和變化(scale),這里就可以通過使用 scale() 方法實(shí)現(xiàn)放大和縮小圖片。下面是兩個(gè)按鈕點(diǎn)擊時(shí)觸發(fā)的方法的具體代碼:

 1 def large_click(self):
 2     """
 3     used to enlarge image
 4     :return:
 5     """
 6     if self.box.scale < 2:
 7         self.box.scale += 0.1
 8         self.box.adjustSize()
 9         self.update()
10 
11 def small_click(self):
12     """
13     used to reduce image
14     :return:
15     """
16     if self.box.scale > 0.1:
17         self.box.scale -= 0.2
18         self.box.adjustSize()
19         self.update()

  

完整代碼已上傳到 GitHub!

總結(jié)

以上是生活随笔為你收集整理的使用 PyQt5 实现图片查看器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。