您好,登錄后才能下訂單哦!
這篇文章主要講解了使用PyQt5實(shí)現(xiàn)圖片查看器的方法,內(nèi)容清晰明了,對(duì)此有興趣的小伙伴可以學(xué)習(xí)一下,相信大家閱讀完之后會(huì)有幫助。
一、前言
在學(xué)習(xí) PyQt5 的過(guò)程中我會(huì)不斷地做一些小的 Demo,用于讓自己能夠更好地理解和學(xué)習(xí),這次要做的就是一個(gè)圖片查看器,主要功能包括打開(kāi)圖片、拖動(dòng)圖片、放大和縮小圖片。
最終實(shí)現(xiàn)的圖片查看器你效果如下:
二、主要步驟
1.顯示圖片
PyQt5 繪圖系統(tǒng)能渲染矢量圖像、位圖圖像和輪廓字體文本。一般會(huì)使用在修改或者提高現(xiàn)有組件的功能,或者創(chuàng)建自己的組件,使用 PyQt5 的繪圖 API 進(jìn)行操作。在 Qt 中有 QPainter 類用于執(zhí)行繪制的操作,繪圖由 paintEvent() 來(lái)完成,繪圖的代碼要放在 QPainter 對(duì)象的 start() 和 end() 方法之間。
要將圖片顯示出來(lái),首先是繼承 QWidget,然后實(shí)現(xiàn) paintEvent() 方法,主要是使用 drawPixmap() 方法,需要傳入 QPixmap 對(duì)象并將其繪制出來(lái),繪圖的代碼如下:
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.拖動(dòng)圖片
在圖片成功顯示出來(lái)之后,需要能夠去拖動(dòng)圖片,以便于查看圖片的每個(gè)角落,主要得實(shí)現(xiàn)三個(gè)方法:mouseMoveEvent、mousePressEvent 和 mouseReleaseEvent,分別對(duì)應(yīng)移動(dòng)鼠標(biāo)、點(diǎn)擊鼠標(biāo)和松開(kāi)鼠標(biāo)三個(gè)事件。
思路是獲取鼠標(biāo)點(diǎn)擊時(shí)的位置,然后根據(jù)鼠標(biāo)位置的變化來(lái)計(jì)算圖片需要移動(dòng)的距離,再移動(dòng)圖片就行了。具體代碼如下:
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.打開(kāi)文件
有時(shí)候我們會(huì)想打開(kāi)本地的文件進(jìn)行查看,所以還要實(shí)現(xiàn)一個(gè)打開(kāi)文件的功能。而要實(shí)現(xiàn)這一功能,可以用 QFileDialog 類來(lái)實(shí)現(xiàn),該類里有一個(gè) getOpenFileName() 方法,使用該方法能夠打開(kāi)本地路徑并選擇符合文件要求格式的文件,例如使用“*.png”就支持打開(kāi)所有 png 格式的圖片文件,而不支持其他格式的文件。
getOpenFileName() 方法有兩個(gè)返回值,第一個(gè)返回值是所選擇的文件的路徑,第二個(gè)返回值是文件類型,得到文件路徑后就能創(chuàng)建一個(gè) QPixmap 對(duì)象,再使用前面顯示圖片的方法進(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.放大縮小圖片
在查看圖片的時(shí)候,有時(shí)候會(huì)需要放大了觀看圖片的某些細(xì)節(jié)部分,因而需要實(shí)現(xiàn)放大和縮小圖片的功能,所以做了兩個(gè)按鈕分別用于放大圖片和縮小圖片。
在 QPainter 中,可以根據(jù) QPainter 的坐標(biāo)系進(jìn)行各種變換,例如平移(translate)和變化(scale),這里就可以通過(guò)使用 scale() 方法實(shí)現(xiàn)放大和縮小圖片。下面是兩個(gè)按鈕點(diǎn)擊時(shí)觸發(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()
看完上述內(nèi)容,是不是對(duì)使用PyQt5實(shí)現(xiàn)圖片查看器的方法有進(jìn)一步的了解,如果還想學(xué)習(xí)更多內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。