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_()

posted @ 2024-06-04 17:20  星空28  阅读(22)  评论(0编辑  收藏  举报