PyQT5之图片左右翻页
图片滚动
import os
from PyQt5 import QtWidgets
from PyQt5 import QtCore, QtGui
import sys
import cv2
class ButtonPanel(QtWidgets.QWidget):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.image_files = []
self.img_idx = -1
select_btn = QtWidgets.QPushButton("图像选择")
back_pix = QtWidgets.QStyle.SP_ArrowBack
back_icon = self.style().standardIcon(back_pix) # 向后图标
back_btn = QtWidgets.QPushButton(back_icon, "")
back_btn.setToolTip("上一张...") # 鼠标悬停显示上一张
back_btn.setMinimumHeight(48)
forward_pix = QtWidgets.QStyle.SP_ArrowForward
forward_icon = self.style().standardIcon(forward_pix) # 向前图标
forward_btn = QtWidgets.QPushButton(forward_icon, "")
forward_btn.setToolTip("下一张...") # 鼠标悬停显示下一张
forward_btn.setMinimumHeight(48)
self.path_label = QtWidgets.QLabel()
self.path_label.setText("当前未显示图像路径")
self.path_label.setAlignment(QtCore.Qt.AlignCenter) # label上居中显示
self.path_label.setMaximumHeight(50) # label最大高度设置
self.path_label.setStyleSheet("background-color:pink;color:green") # 背景颜色设置
font = QtGui.QFont()
font.setBold(True)
font.setPointSizeF(10)
self.path_label.setFont(font)
self.image_label = QtWidgets.QLabel()
# 方法二:使用cv2显示
src = cv2.imread("./image/img1.png") # BGR
image = cv2.cvtColor(src, cv2.COLOR_BGR2RGB) # 将BGR转为RGB
h, w, c = image.shape
img = QtGui.QImage(image.data, w, h, 3 * w, QtGui.QImage.Format_RGB888)
pixmap = QtGui.QPixmap(img)
pix = pixmap.scaled(QtCore.QSize(640, 640), QtCore.Qt.KeepAspectRatio) # 自动保持比例放缩方式
self.image_label.setPixmap(pix) # 设置图像显示
self.image_label.setAlignment(QtCore.Qt.AlignCenter) # label上的内容居中显示
self.image_label.setStyleSheet("background-color:blue;color:green") # 背景颜色设置
btn_panel = QtWidgets.QGroupBox("图像文件选择")
hboxlayout = QtWidgets.QHBoxLayout()
hboxlayout.addWidget(self.path_label)
hboxlayout.addWidget(select_btn)
hboxlayout.addStretch(1)
btn_panel.setLayout(hboxlayout)
bf_panel = QtWidgets.QWidget()
hblayout = QtWidgets.QHBoxLayout()
hblayout.addWidget(back_btn)
hblayout.addWidget(forward_btn)
bf_panel.setLayout(hblayout)
vboxlayout = QtWidgets.QVBoxLayout()
vboxlayout.addWidget(btn_panel)
vboxlayout.addWidget(self.image_label)
vboxlayout.addWidget(bf_panel)
vboxlayout.addStretch(1)
self.setLayout(vboxlayout)
# 绑定点击
# select_btn.clicked.connect(self.on_select_image)
select_btn.clicked.connect(self.on_select_dir)
back_btn.clicked.connect(self.on_back_image)
forward_btn.clicked.connect(self.on_forward_image)
def on_select_image(self):
fileinfo = QtWidgets.QFileDialog.getOpenFileName(self, "打开图像文件", ".", "图像文件(*.jpg *.png)")
fileName = fileinfo[0]
if fileName != "":
self.path_label.setText(fileName)
pixmap = QtGui.QPixmap(fileName)
pix = pixmap.scaled(QtCore.QSize(640, 640), QtCore.Qt.KeepAspectRatio) # 自动保持比例放缩方式
self.image_label.setPixmap(pix) # 设置图像显示
def on_select_dir(self):
# 获取文件夹地址
curr_dir = QtWidgets.QFileDialog.getExistingDirectory(self, "图像文件夹", ".")
files = os.listdir(curr_dir)
self.image_files.clear()
for f in files:
print(f)
self.image_files.append(os.path.join(curr_dir, f))
self.img_idx = 0
pixmap = QtGui.QPixmap(self.image_files[self.img_idx])
pix = pixmap.scaled(QtCore.QSize(640, 640), QtCore.Qt.KeepAspectRatio) # 自动保持比例放缩方式
self.image_label.setPixmap(pix) # 设置图像显示
def on_back_image(self):
print("previous image...")
if self.img_idx == -1:
return
self.img_idx -= 1
if self.img_idx < 0:
self.img_idx = 0
pixmap = QtGui.QPixmap(self.image_files[self.img_idx])
pix = pixmap.scaled(QtCore.QSize(640, 640), QtCore.Qt.KeepAspectRatio) # 自动保持比例放缩方式
self.image_label.setPixmap(pix) # 设置图像显示
def on_forward_image(self):
print("next image...")
if self.img_idx == -1:
return
self.img_idx += 1
if len(self.image_files) > self.img_idx:
pixmap = QtGui.QPixmap(self.image_files[self.img_idx])
pix = pixmap.scaled(QtCore.QSize(640, 640), QtCore.Qt.KeepAspectRatio) # 自动保持比例放缩方式
self.image_label.setPixmap(pix) # 设置图像显示
else:
self.img_idx = len(self.image_files) - 1
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
main_win = QtWidgets.QMainWindow()
main_win.setWindowTitle("图像浏览显示")
myPanel = ButtonPanel()
main_win.setCentralWidget(myPanel)
main_win.setMinimumSize(1080, 720)
main_win.show()
app.exec_()