我們接下來的討論,會基於讀者已經先讀過我 day5 文章 的架構下去進行程式設計
如果還不清楚我程式設計的邏輯 (UI.py、controller.py、start.py 分別在幹麻)
建議先閱讀 day5 文章後再來閱讀此文。
https://www.wongwonggoods.com/python/pyqt5-5/
https://github.com/howarder3/ironman2021_PyQt5_photoshop/tree/main/day11_display_image
我們在先前的文章中已經有提過,我們可以使用 Qlabel 作為顯示文字,
同樣的,我們也可以使用 Qlabel 來顯示圖片。
今天我們就要來實作這個功能。
我們先點擊 QMainWindow 的部份,
展開 geometry,這裡修改 Width, Height 可以直接改變整個視窗的大小。
建議修改要大一點,因為要顯示的圖片可能也會很大。
我們使用與之前一樣的方式新增一個 Qlabel,文字可以先不用管他,
但我們需要先改變 Qlabel 所佔的範圍大小,
展開 geometry,這裡修改 Width, Height 可以直接改變 Qlabel 顯示視窗的大小。
而上面的 X, Y 可以個人需求修改,X, Y 表示的是「相對 MainWindow」此 Label 開始顯示的位置。
(從左上角開始算,往右X、往下Y)
這邊有兩件事情要注意:
- 修改後的
Qlabel geometry
必須小於主程式的 QMainWindow` (畫面比視窗大不合理吧XD)如果 Qlabel geometry 設定的解析度不夠大,有可能會只有只顯示部份圖片的情形
(從左上開始自動剪裁)
讀者們可以開始自行設計自己的介面囉,以上為我的示範。
一樣的編譯指令,我們加上 -x (也可不加),
我們就可以先檢視看看轉換後的視窗是不是跟我們想像的一樣。
pyuic5 -x day11.ui -o UI.py
一樣,這程式只有介面 (視覺上的呈現),沒有任何互動功能
python UI.py
這邊可以看到很單純的只有一段被初始化的文字,
接下來我們要開始去改變裡面的內容。
這次我們只有一個物件 self.label
還記得我們在 day5 中的模板嗎?這邊我們直接複製過來使用並修改。
from PyQt5 import QtWidgets, QtCore
from PyQt5.QtGui import QImage, QPixmap
import cv2
from UI import Ui_MainWindow
class MainWindow_controller(QtWidgets.QMainWindow):
def __init__(self):
super().__init__() # in python3, super(Class, self).xxx = super().xxx
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.setup_control()
def setup_control(self):
# TODO
self.img_path = 'cat_small.jpg'
self.display_img()
def display_img(self):
self.img = cv2.imread(self.img_path)
height, width, channel = self.img.shape
bytesPerline = 3 * width
self.qimg = QImage(self.img, width, height, bytesPerline, QImage.Format_RGB888).rgbSwapped()
self.ui.label.setPixmap(QPixmap.fromImage(self.qimg))
照我們 day5 的程式架構,我們執行
python start.py
就會像下圖這樣,因為圖片太大了,800*600 只能顯示部份圖片
★ 本文也同步發於我的個人網站(會有內容目錄與顯示各個小節,閱讀起來更流暢):【PyQt5】Day 11 - 以 Qlabel 在 PyQt 中顯示圖片 (基於 QImage 使用 OpenCV)