图片滚动
import osfrom PyQt5 import QtWidgets
from PyQt5 import QtCore, QtGui
import sys
import cv2class ButtonPanel(QtWidgets.QWidget):def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)self.image_files = []self.img_idx = -1select_btn = QtWidgets.QPushButton("图像选择")back_pix = QtWidgets.QStyle.SP_ArrowBackback_icon = self.style().standardIcon(back_pix) # 向后图标back_btn = QtWidgets.QPushButton(back_icon, "")back_btn.setToolTip("上一张...") # 鼠标悬停显示上一张back_btn.setMinimumHeight(48)forward_pix = QtWidgets.QStyle.SP_ArrowForwardforward_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") # BGRimage = cv2.cvtColor(src, cv2.COLOR_BGR2RGB) # 将BGR转为RGBh, w, c = image.shapeimg = 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 = 0pixmap = 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:returnself.img_idx -= 1if self.img_idx < 0:self.img_idx = 0pixmap = 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:returnself.img_idx += 1if 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) - 1if __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_()