使用PyQt5實(shí)現(xiàn)圖片查看器的示例代碼
一、前言
在學(xué)習(xí) PyQt5 的過程中我會不斷地做一些小的 Demo,用于讓自己能夠更好地理解和學(xué)習(xí),這次要做的就是一個圖片查看器,主要功能包括打開圖片、拖動圖片、放大和縮小圖片。
最終實(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 對象并將其繪制出來,繪圖的代碼如下:
def paintEvent(self, e):
"""
receive paint events
:param e: QPaintEvent
:return:
"""
if self.scaled_img:
painter = QPainter()
painter.begin(self)
painter.drawPixmap(self.point, self.scaled_img)
painter.end()
2.拖動圖片
在圖片成功顯示出來之后,需要能夠去拖動圖片,以便于查看圖片的每個角落,主要得實(shí)現(xiàn)三個方法:mouseMoveEvent、mousePressEvent 和 mouseReleaseEvent,分別對應(yīng)移動鼠標(biāo)、點(diǎn)擊鼠標(biāo)和松開鼠標(biāo)三個事件。
思路是獲取鼠標(biāo)點(diǎn)擊時的位置,然后根據(jù)鼠標(biāo)位置的變化來計算圖片需要移動的距離,再移動圖片就行了。具體代碼如下:
def mouseMoveEvent(self, e):
"""
mouse move events for the widget
:param e: QMouseEvent
:return:
"""
if self.left_click:
self.end_pos = e.pos() - self.start_pos
self.point = self.point + self.end_pos
self.start_pos = e.pos()
self.repaint()
def mousePressEvent(self, e):
"""
mouse press events for the widget
:param e: QMouseEvent
:return:
"""
if e.button() == Qt.LeftButton:
self.left_click = True
self.start_pos = e.pos()
def mouseReleaseEvent(self, e):
"""
mouse release events for the widget
:param e: QMouseEvent
:return:
"""
if e.button() == Qt.LeftButton:
self.left_click = False
3.打開文件
有時候我們會想打開本地的文件進(jìn)行查看,所以還要實(shí)現(xiàn)一個打開文件的功能。而要實(shí)現(xiàn)這一功能,可以用 QFileDialog 類來實(shí)現(xiàn),該類里有一個 getOpenFileName() 方法,使用該方法能夠打開本地路徑并選擇符合文件要求格式的文件,例如使用“*.png”就支持打開所有 png 格式的圖片文件,而不支持其他格式的文件。
getOpenFileName() 方法有兩個返回值,第一個返回值是所選擇的文件的路徑,第二個返回值是文件類型,得到文件路徑后就能創(chuàng)建一個 QPixmap 對象,再使用前面顯示圖片的方法進(jìn)行顯示,具體代碼如下:
def open_image(self): """ select image file and open it :return: """ img_name, _ = QFileDialog.getOpenFileName(self, "Open Image File", "*.jpg;;*.png;;*.jpeg") self.box.set_image(img_name)
4.放大縮小圖片
在查看圖片的時候,有時候會需要放大了觀看圖片的某些細(xì)節(jié)部分,因而需要實(shí)現(xiàn)放大和縮小圖片的功能,所以做了兩個按鈕分別用于放大圖片和縮小圖片。
在 QPainter 中,可以根據(jù) QPainter 的坐標(biāo)系進(jìn)行各種變換,例如平移(translate)和變化(scale),這里就可以通過使用 scale() 方法實(shí)現(xiàn)放大和縮小圖片。下面是兩個按鈕點(diǎn)擊時觸發(fā)的方法的具體代碼:
def large_click(self):
"""
used to enlarge image
:return:
"""
if self.box.scale < :
self.box.scale += .
self.box.adjustSize()
self.update()
def small_click(self):
"""
used to reduce image
:return:
"""
if self.box.scale > .:
self.box.scale -= .
self.box.adjustSize()
self.update()
完整代碼已上傳到 GitHub !
到此這篇關(guān)于使用PyQt5實(shí)現(xiàn)圖片查看器的示例代碼的文章就介紹到這了,更多相關(guān)PyQt5 圖片查看器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- PyQt5 實(shí)現(xiàn)給無邊框widget窗口添加背景圖片
- opencv+pyQt5實(shí)現(xiàn)圖片閾值編輯器/尋色塊閾值利器
- python GUI框架pyqt5 對圖片進(jìn)行流式布局的方法(瀑布流flowlayout)
- python GUI庫圖形界面開發(fā)之PyQt5圖片顯示控件QPixmap詳細(xì)使用方法與實(shí)例
- pyqt5 使用cv2 顯示圖片,攝像頭的實(shí)例
- pyqt5讓圖片自適應(yīng)QLabel大小上以及移除已顯示的圖片方法
- pyqt5實(shí)現(xiàn)繪制ui,列表窗口,滾動窗口顯示圖片的方法
- PyQt5 QTable插入圖片并動態(tài)更新的實(shí)例
- PyQt5 對圖片進(jìn)行縮放的實(shí)例
- PyQt5 顯示超清高分辨率圖片的方法
相關(guān)文章
Python實(shí)現(xiàn)日期判斷和加減操作詳解
這篇文章主要介紹了如何利用Python實(shí)現(xiàn)日期的判斷,以及對日期的加減操作,文中的示例代碼對我們學(xué)習(xí)或工作有一定的價值,需要的可以參考一下2022-01-01
關(guān)于Python的json字符串與json模塊解讀
這篇文章主要介紹了關(guān)于Python的json字符串與json模塊解讀,JSON采用完全獨(dú)立于語言的文本格式,但是也使用了類似于C語言家族的習(xí)慣(包括C,?C++,?C#,?Java,?JavaScript,?Perl,?Python等),這些特性使JSON成為理想的數(shù)據(jù)交換語言,需要的朋友可以參考下2023-07-07
如何利用Python+Vue實(shí)現(xiàn)簡單的前后端分離
因?yàn)閜ython開發(fā)的高效性,python web開發(fā)也受到越來越多人的關(guān)注,下面這篇文章主要給大家介紹了關(guān)于如何利用Python+Vue實(shí)現(xiàn)簡單的前后端分離的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07

