0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用QPushButton与QLabel组件实现一个简单的批量图像浏览

OpenCV学堂 来源:OpenCV开发者联盟 2023-01-31 11:58 次阅读

引言

基于前面几篇文章介绍的知识点,使用QPushButton与QLabel组件结合水平与垂直布局管理器,实现一个简单的批量图像浏览,支持图像文件夹选择、按钮信号触发与槽函数响应、支持上一张、下一张图像浏览,实现一个最简化版本的图像浏览器

垂直与水平布局混合使用

PyQT5中的QWidget对象支持嵌套方式,在一个QWidget中可以支持多个子QWidget对象,每个QWidget都有自己的布局方式,这样通过多重QWidget嵌套与叠加就可以实现复杂界面设计。在我开发OpenMV工具软件过程中,多数子界面都是通过水平跟垂直布局嵌入实现的界面设计。这样做的好处是避免使用绝对定位方式布局组件元素导致不同分辨率的显示差异与用户体验不一致。

e280a1de-a113-11ed-bfe3-dac502259ad0.png

上图中第一行有三个组元素,两个QLabel,分别显示当前文件路径与文件夹总图像数目;一个按钮实现图像文件夹选择功能,三个组件元素在一个子QWidget对象(panel1)中通过水平布局方式(QHBoxLayout)从左到右排列。

内置图标ICON使用

PyQT5的QStyle支持内置图标ICON支持,支持常见应用程序开发所需要的图标,直接使用这些图标可以省去很多麻烦。支持的图标列表请看下图说明:

e2a518ac-a113-11ed-bfe3-dac502259ad0.png

采用下面的相似代码即可获取需要的ICON图标使用。

back_pix = QtWidgets.QStyle.SP_ArrowBack
back_icon = self.style().standardIcon(back_pix)
图表文件名称列表如下:

e2cf4906-a113-11ed-bfe3-dac502259ad0.png

中间是一个QLabel组件实现图像显示与更新功能 最后一行基于PyQT5的QStyle中内置图标引用实现了两个ICON按钮功能,支持Tooltip提示功能,分别实现显示上一张与下一张图像切换显示功能。两个ICON按钮通过水平布局方式同样放在一个QWidget对象(panel2)中。

最终把panel1、imageLabel、panel2三个子元素通过垂直布局(QVBoxLayout)添加到自定义的QWidget对象-ImageBrowserPanel

最后在主程序中初始化ImageBrowserPanel对象实例,设置为QMainWindow的CenteralWidget即可完成。

按钮信号与响应

三个按钮分别完成图像文件夹选择、上一张更新显示、下一张更新显示。默认选择图像文件夹之后会显示该文件夹中第一张图像,同时更新文件显示QLabel上显示信息与imageLabel上显示的图像内容。

运行演示与代码

运行结果演示:

e2e62db0-a113-11ed-bfe3-dac502259ad0.gif

主面板界面类代码如下:


class ImageBrowserPanel(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.image_files = []
        self.current_index = -1
        # 文本标签
        self.pathLabel = QtWidgets.QLabel()
        self.pathLabel.setText("文件名称: test.png")
        self.pathLabel.setStyleSheet("background-color:deeppink; color: blue; border-radius:5px")
        self.pathLabel.setAlignment(QtCore.Qt.AlignCenter)
        # 图像总数
        self.numLabel = QtWidgets.QLabel()
        self.numLabel.setText("图像总数: 0")
        self.pathLabel.setStyleSheet("background-color:deeppink; color: blue; border-radius:5px")
        self.numLabel.setAlignment(QtCore.Qt.AlignCenter)


        fileBtn = QtWidgets.QPushButton("选择...")
        hbox_layout = QtWidgets.QHBoxLayout()
        hbox_layout.addWidget(self.pathLabel)
        hbox_layout.addWidget(self.numLabel)
        hbox_layout.addWidget(fileBtn)
        hbox_layout.addStretch(1)
        panel1 = QtWidgets.QGroupBox("图像信息")
        panel1.setLayout(hbox_layout)


        # 图像标签
        self.imgLabel = QtWidgets.QLabel()
        pixmap = QtGui.QPixmap("test3.png")
        pix = pixmap.scaled(QtCore.QSize(620, 500), QtCore.Qt.KeepAspectRatio)
        self.imgLabel.setPixmap(pix)
        self.imgLabel.setAlignment(QtCore.Qt.AlignCenter)


        # 左右浏览
        back_pix = QtWidgets.QStyle.SP_ArrowBack
        back_icon = self.style().standardIcon(back_pix)


        forward_pix = QtWidgets.QStyle.SP_ArrowForward
        forward_icon = self.style().standardIcon(forward_pix)


        backBtn = QtWidgets.QPushButton(back_icon, "")
        backBtn.setIconSize(QtCore.QSize(48, 48))
        backBtn.setToolTip("上一张")


        forwardBtn = QtWidgets.QPushButton(forward_icon, "")
        forwardBtn.setIconSize(QtCore.QSize(48, 48))
        forwardBtn.setToolTip("下一张")


        panel2 = QtWidgets.QWidget()
        hbox_layout2 = QtWidgets.QHBoxLayout()
        hbox_layout2.addWidget(backBtn)
        hbox_layout2.addWidget(forwardBtn)
        panel2.setLayout(hbox_layout2)


        # 添加到布局管理器中
        vbox_layout = QtWidgets.QVBoxLayout()
        vbox_layout.addWidget(panel1)
        vbox_layout.addWidget(self.imgLabel)
        vbox_layout.addWidget(panel2)
        vbox_layout.addStretch(1)


        # 面板容器
        self.setLayout(vbox_layout)


        # setup listener
        fileBtn.clicked.connect(self.on_select_image_dir)
        backBtn.clicked.connect(self.on_back_image_view)
        forwardBtn.clicked.connect(self.on_forward_image_view)


    def on_back_image_view(self):
        if self.current_index > 0:
            self.current_index = self.current_index - 1
            filename = self.image_files[self.current_index]
            self.pathLabel.setText("文件名称: " + filename)
            print(filename)
            pixmap = QtGui.QPixmap(filename)
            pix = pixmap.scaled(QtCore.QSize(620, 500), QtCore.Qt.KeepAspectRatio)
            self.imgLabel.setPixmap(pix)


    def on_forward_image_view(self):
        last = len(self.image_files) - 1
        if self.current_index < last:
            self.current_index = self.current_index + 1
            filename = self.image_files[self.current_index]
            self.pathLabel.setText("文件名称: " + filename)
            print(filename)
            pixmap = QtGui.QPixmap(filename)
            pix = pixmap.scaled(QtCore.QSize(620, 500), QtCore.Qt.KeepAspectRatio)
            self.imgLabel.setPixmap(pix)


    def on_select_image_dir(self):
        img_dir = QtWidgets.QFileDialog.getExistingDirectory(self, "图像文件夹", ".")
        files = os.listdir(img_dir)
        self.image_files.clear()
        self.current_index = -1
        for f in files:
            if f.endswith(".png") or f.endswith(".jpg") or f.endswith(".bmp"):
                self.image_files.append(os.path.join(img_dir, f))
        if len(self.image_files) > 0:
            self.current_index = 0
            filename = self.image_files[0]
            print(filename)
            self.pathLabel.setText("文件名称: " + filename)
            self.numLabel.setText("图像总数: " + str(len(self.image_files)))
            pixmap = QtGui.QPixmap(filename)
            pix = pixmap.scaled(QtCore.QSize(620, 500), QtCore.Qt.KeepAspectRatio)
            self.imgLabel.setPixmap(pix)
上述代码演示了如何打开文件夹,遍历图像文件、如何更新QLabel上显示的图像与文字信息,如何构建一个自定义的QWidget对象。

QApplication应用程序代码如下:

# 初始化APP实例
app = QtWidgets.QApplication(sys.argv)
# 初始化桌面容器
main_win = QtWidgets.QMainWindow()
# 设置APP窗口名称
main_win.setWindowTitle("PyQT5图像浏览器-2号高手")
# 初始化内容面板
content_panel = ImageBrowserPanel()
# 设置窗口大小
main_win.setMinimumSize(640, 500)
main_win.setCentralWidget(content_panel)


# 请求显示
main_win.show()
# 加载窗口并启动App
app.exec()

运行结果如下:

e2f655f0-a113-11ed-bfe3-dac502259ad0.png 总结

本文主要是演示了PyQT5中水平与垂直布局组合,多个QWidget组件嵌套使用排版,按钮事件触发与槽函数更新UI组件的各种PyQT5基本编程技能与技巧。







审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • pyqt5
    +关注

    关注

    0

    文章

    25

    浏览量

    3361
  • openMV
    +关注

    关注

    3

    文章

    29

    浏览量

    9681

原文标题:PyQT5开发案例之简易图像浏览器

文章出处:【微信号:CVSCHOOL,微信公众号:OpenCV学堂】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Visual C# 打造 “浏览器”

    “AxSHDocVw”,在此命名空间中定义了“AxWebBrowser”组件,这个组件中有若干个方法和属性,Visual C#就是通过这些方法和属性来
    发表于 02-20 10:25

    关于QT中使用pixmap进行图片的切换问题

    /my_program/picture/picture.jpg"; QLabel *label=new QLabel; button_change=new QPushButton("
    发表于 01-20 15:04

    《Visual C# 2008程序设计经典案例设计与实现》---利用Windows组件打印输出图像

    《Visual C# 2008程序设计经典案例设计与实现》---利用Windows组件打印输出图像
    发表于 05-22 21:04

    《Visual C# 2008程序设计经典案例设计与实现》---利用TreeView控件浏览图像

    《Visual C# 2008程序设计经典案例设计与实现》---利用TreeView控件浏览图像.zip
    发表于 05-22 21:05

    如何才能允许组件分组并添加简单的片外终端组件

    包含在组中。这两问题的很好的解决方案是允许组件被分组并且具有非常
    发表于 10-18 09:53

    请问怎么把STM32F7NG写成简单浏览器?

    怎么可以把STM32F7NG写成简单浏览器,能显示只有图片和文字的HTML代码或文件.
    发表于 03-10 05:14

    实现在stm32单片机的RGB565图像简单处理

    c++读取输出的数据,转化为0~255范围中的单个r,g,b数值,产生txt文件,最后运行matlab程序,实现单片机颜色识别的的图像显示,由于单片机没有外接显示屏,所以采用c++
    发表于 08-17 07:38

    使用JS实现简单的HarmonyOS购物应用

    1. 介绍本篇Codelab将会使用UI组件开发出HarmonyOS购物应用。HarmonyOS为开发者提供了多种组件,每个组件通过对数
    发表于 09-23 10:40

    怎么去解决QLabel控件无法播放GIF动画的问题

    ubuntu系统上gif动画播放正常,移植到arm上的应用程序是正常启动的,但QLabel控件上无法播放GIF动画。QLabel控件上图片是可以正常显示的。 QMovie *movie = new
    发表于 01-10 07:40

    CH552 WCHISPTool V2.9如何实现批量下载?

    通过自动下载选项插烧写吗?V2.9的串口批量烧写也不见了?我期望还是不用插拔形式能实现
    发表于 06-07 09:16

    【飞凌RK3568开发板试用体验】5-Qt开发相册浏览

    本篇继续来实现Qt相册浏览器软件,可以实现OK3568-C板子中图片的查看,方便后面制作相机拍照功能后,可以查看拍出的照片,先来看下最终
    发表于 12-08 22:32

    如何在浏览器窗口中为您的Lua代码发布非常简单的在线编辑器?

    我想在浏览器窗口中为您的 Lua 代码发布非常简单的在线编辑器。这是老项目,但我让它在最
    发表于 05-04 06:49

    comicsviewer图像浏览器软件

    电子发烧友网站提供《comicsviewer图像浏览器软件.zip》资料免费下载
    发表于 06-19 17:00 0次下载

    使用Visual Baisc实现简单的文件浏览器的程序和工程文件

    本文档的主要内容详细介绍的是使用Visual Baisc实现简单的文件浏览器的程序和工程文件。
    发表于 09-18 16:48 14次下载
    使用Visual Baisc<b class='flag-5'>实现</b><b class='flag-5'>简单</b>的文件<b class='flag-5'>浏览</b>器的程序和工程文件

    LabVIEW批量读写三菱PLC数据如何实现呢?

    一直有小伙伴在问LabVIEW批量读写三菱PLC数据的问题,今天给大家上点干货。众所周知,LabVIEW通过MX组件可以实现三菱plc的数据读写
    的头像 发表于 10-17 09:52 2312次阅读
    LabVIEW<b class='flag-5'>批量</b>读写三菱PLC数据如何<b class='flag-5'>实现</b>呢?