本專案可以檢視硬碟中的圖片,完成品如下

說明
左邊的縮圖,為ListWidget中加入QPushButton,QPushButton中置入Icon. 右邊顯示大圖的部份為QLable。讀取硬碟圖片時, 時間非常長, 所以將讀取圖片的任務置於QThread中,待讀取完一張,就放入ListWidget一次。所以就會有讀一張顯示一張的效果了。
import os
import sys
from PyQt5.QtCore import QThread, pyqtSignal, QSize
from PyQt5.QtGui import QPixmap, QIcon
from PyQt5.QtWidgets import QMainWindow, QApplication, QPushButton, QListWidgetItem, QFileDialog
from ui.ui_mainwindow import Ui_MainWindow
class PicThread(QThread):
callback=pyqtSignal(object)
def __init__(self, path, parent=None):
super().__init__(parent)
self.path=path
self.runFlag=True
def run(self):
ls=os.listdir(self.path)
files=[]
for l in ls:
ll=l.lower()
if ll.endswith('.jpg') or ll.endswith('.png'):
files.append(f'{self.path}/{l}')
index=0
while index<len(files) and self.runFlag:
pix = QPixmap(files[index])
pix = pix.scaled(400, 300)
pix.tag=files[index]
self.callback.emit(pix)
index+=1
QThread.msleep(10) # 要停一下, 否則UI無法立即顯示
class MainWindow(QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super().__init__(parent)
self.setupUi(self)
self.path=os.path.abspath(os.path.curdir)
self.lblPath.setText(self.path)
self.btnPath.clicked.connect(self.btnPath_click)
self.thread=PicThread(self.path)
self.thread.callback.connect(self.refresh)
self.thread.start()
def btnPath_click(self):
self.path = QFileDialog.getExistingDirectory()
if self.path != '':
self.lblPath.setText(self.path)
self.lsIcon.clear()
self.thread = PicThread(self.path)
self.thread.callback.connect(self.refresh)
self.thread.start()
def btn_click(self):
btn=self.sender()
pix=QPixmap(btn.tag)
w = pix.width()
h = pix.height()
r = w / h
sw = self.lblImg.width()
sh = self.lblImg.height()
sr = sw / sh
if r > sr:
pix = pix.scaled(sw, sw / r)
else:
pix = pix.scaled(sh * r, sh)
self.lblImg.setPixmap(pix)
def refresh(self, pix):
btn=QPushButton()
btn.setIcon(QIcon(pix))
btn.setIconSize(QSize(400,300))
btn.tag=pix.tag
btn.clicked.connect(self.btn_click)
item=QListWidgetItem()
item.setSizeHint(QSize(400,300))
self.lsIcon.addItem(item)
self.lsIcon.setItemWidget(item, btn)
if __name__=='__main__':
app=QApplication(sys.argv)
frame=MainWindow()
frame.showMaximized()
app.exec()
