基于pyqt5实现一款简单的界面软件(radioButton、comboBox、pushButton、图片显示)

news2024/12/23 22:47:30

pyqt5使用记录涉及pyqt界面控件的基本介绍,使用designer设计界面ui,并将其转化为py代码。关于界面主要实现radioButton的互斥选中事件、comboBox的选中事件(依据list添加item)、pushButton的单击事件、槽函数自动绑定、图片的拖入显示。

1、pyqt环境配置

1.1 pyqt安装

pip install pyqt5
pip install pyqt5-tools

1.2 pyqt配置

在python环境路径下找到designer.exe的路径
在这里插入图片描述

将找到的路径 C:\anaconda\Lib\site-packages\qt5_applications\Qt\bin
添加到windows的系统环境变量path的路径中
在这里插入图片描述

2、界面设计

2.1 启动界面设计器

打开终端,然后输入designer.exe按回车即可启动pyqt的界面设计器。
然后点击文件-》新建,找到Main Window并选择,然后创建一个主界面文件。
在这里插入图片描述

2.2 pyqt中的控件

从一个不专业的软件工程师以前端页面设计的角度看pyqt中的控件,主要可以分为页面布局控件、控件容器、按钮控件、输出控件(显示文本图表等)。

具体的页面布局控件如下所示,其包含垂直布局、水平布局、网格布局、表单布局。页面布局的本意就是减少各位在设计控件控件关系时的难度,其会强制各个控件按照布局样式进行排列。这些页面布局之间是不支持有效嵌套的。
在这里插入图片描述
控件容器是比页面布局低一级但比页面控件高一级的存在,博主平时很少使用。如下图中的Group Box可以内置多个同组的控件(如单选框或多选框)、Scroll Area可以内置text控件用于显示长文本、Tab Widget可以实现多选项卡(在每个选项卡容器中分别放置不同的控件或页面布局)
在这里插入图片描述

pyqt中提供的按钮有些多,但博主认为重要的只有Push Button(普通的按钮)、Radio Button(单选框,在使用时需要将多个radio button放在同一个父级控件容器中)、Check Button(单选框,在使用时需要将多个radio buttonn放在同一个父级控件容器中)。其他button的效果都可以通过Push Button来实现,就比如其中的command link button。
在这里插入图片描述
pyqt中提供的输入控件如下所示,包括下拉框、文本输入框(单行、多行、富文本)、步进器(通过按钮调整数值)、时间日期选择器、旋转按钮、水平垂直拖动头、水平垂直滑块
在这里插入图片描述
pyqt中的页面控件较多,博主目前仅使用到图像、文本展示功能,故只用到Label控件(显示文本、图片)、Text Browser控件(显示长文本)、Graphics View控件(显示画板)。
在这里插入图片描述

更多的常用控件介绍可以参考:https://blog.csdn.net/ungoing/article/details/126506569

2.3 设计界面ui

博主这里计划实现一个yolov8模型的调用软件,所设计的页面如下所示。其中需要注意的是所设置的comboBox并没有指定默认的列表(因为博主计划以读文件的方式实现),同时对于radioButton可以看到博主将其防止到了同一个父容器下(主要看右图中红色框住的部分),然后可以看到界面中按钮的颜色与众不同。在后续开发中,博主将graphicsView控件修改为label控件 (使用label可以展示文本和图片,而使用graphicsView代码极为复杂)。
在这里插入图片描述
这是因为设置了控件的样式属性,我们可以在右下角的属性编辑器设置控件的各种属性(主要是字体大小颜色、最大最小宽高限制、控件颜色)
在这里插入图片描述
除了右下角的面板外,还可以通过在控件上单击右键选择编辑样式表,设置控件的样式。这里需要注意的是我们要点击的是图中的三角形,而不是文字,否则无法将效果设置到目标格式(如背景颜色、边框颜色、背景图片等格式)上;此外,所生成的设置结果是一种css格式,由key:value;组成,否则会报错。
在这里插入图片描述
页面设计完成后,可以将其保存为ui文件

3、实现软件

3.1 使用界面文件

对于界面ui文件的使用有两种途径,一是直接使用,二是将ui文件转换为py文件然后使用。具体详情可以参考:
https://blog.csdn.net/weixin_44452221/article/details/125961228

直接使用 通过PyQt5.uic.loadUi实现加载ui文件,完整使用代码如下。与转py文件在使用,优点为步骤简单,不需要每一次修改UI都更新ui-py文件;缺点是在绑定函数事件时,需要配合页面设计器才能找到ui控件的对象名称。若要对外发布软件,使用这种方法需要慎重考虑,ui文件无法嵌入到可执行程序中,需要对外保留ui文件

from PyQt5.QtWidgets import QMainWindow, QApplication
from PyQt5 import uic

class MyWindows():

    def __init__(self):
        super().__init__()
        # 使用ui文件导入定义界面类
        self.ui  = uic.loadUi("mainview.ui")
        self.ui.pushButton.clicked.connect(self.click_test)
        # 初始化界面
        #self.ui.setupUi(self)
    def click_test(self):
        print('我被点击了!')
if __name__ == "__main__":
    app = QApplication([])
    windows = MyWindows()
    windows.ui.show() # 去掉ui
    app.exec_()

转py使用 :先将ui文件转换为py文件,然后在代码里调用。优点是在编码时即可知道ui控件的对象名称,并可以在ui-py代码中修改控件的配置;缺点是在每一次修改ui文件后都需要重新生成ui-py文件。若要对外发布软件,推荐使用这种方法,因为虽然麻烦,但可以不对外暴露ui文件
1、执行以下代码将mainview.ui 转换为mainview.py

python -m PyQt5.uic.pyuic  mainview.ui -o mainview.py

2、执行以下代码

from PyQt5.QtWidgets import QMainWindow, QApplication
from mainview import Ui_MainWindow

class MyWindows(QMainWindow):

    def __init__(self):
        super().__init__()
        # 使用ui文件导入定义界面类
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        # 初始化界面
        self.ui.pushButton.clicked.connect(self.click_test)
    def click_test(self):
        print('我被点击了!')

if __name__ == "__main__":
    app = QApplication([])
    test = MyWindows()
    test.show() # 去掉ui
    app.exec_()

执行软件后页面如下所示,在点击开始检测后程序的相应可见下图的右下角部分。
在这里插入图片描述

3.2 事件绑定

对于本次的软件开发,涉及到radioButton、comboBox、button控件的使用,同时还实现了图片拖入显示。以下所有的代码都是要放在class MyWindows(QMainWindow):中。

radioButton选中事件 实现互斥的选中事件。状态监听函数的实现如下,只需要绑定到同一个处理函数即可(只要radioButton在同一个父容器内就会天然的中使用上实现页面效果互斥)。

		self.ui.radioButton.toggled.connect(self.groupBox_click)
        self.ui.radioButton_2.toggled.connect(self.groupBox_click)
        self.ui.radioButton_3.toggled.connect(self.groupBox_click)

单选按钮组点击事件的实现如下,不管点哪一个按钮都会触发groupBox_click函数,然后可以通过radioButton.objectName()进行不同的分支操作。


    def groupBox_click(self):
        radioButton = self.sender() # 获得信号发射的控件
        if radioButton.isChecked() == True:
            #根据radioButton.text()来区分不同的按钮
            #根据radioButton.objectName()来区分不同的按钮
            print(radioButton.text() +"  "+radioButton.objectName()+ "被选中")

pushButton点击事件 这主要是按钮点击事件,可以使用self.ui.pushButton.clicked.connect(self.pushButton_clicked)将控件与事件函数相互绑定。也可以使用@pyqtSlot()直接将函数与同名的控件相互绑定。具体如下:

    ## ====由connectSlotsByName()自动与组件的信号关联的槽函数=====
    # https://www.cnblogs.com/jgg54335/p/14898742.html
    #自动与 pushButton 控件进行clicked 事件的关联   
    @pyqtSlot() #不加这个会被触发两次
    def on_pushButton_clicked(self):
        print(self.ui.pushButton.text())
        if self.ui.pushButton.text()=="暂停检测":
            self.ui.pushButton.setText( "开始检测")
            self.ui.pushButton.setStyleSheet("background-color: rgb(134, 217, 255);")
        else:
            self.ui.pushButton.setText( "暂停检测")
            self.ui.pushButton.setStyleSheet("background-color: rgb(250, 12, 32);")

comboBox选中事件 这先需要为comboBox添加item,具体代码如下:

        self.ui.comboBox.clear() #清除列表
        comblist=["摄像头1","摄像头2","摄像头3","摄像头4","摄像头5","摄像头6"] #列表数据
        for i in range(len(comblist)):
            self.ui.comboBox.addItem(comblist[i])

comboBox的选中事件如下,其输入参数curText可以用于区分被点击的Item

    ## =======自定义带参数的槽函数=======
    @pyqtSlot(str) ##简单的ComboBox的当前项变换
    def on_comboBox_currentIndexChanged(self,curText):
        print(curText) 

图片拖入显示 这需要设置class MyWindows(QMainWindow)中设置其支持文件拖入事件,代码如下,放置在def __init__(self):

self.setAcceptDrops(True)

文件拖入的实现函数,通过判断文件后缀,如果是图片则打开,然后利用self.ui.label.setPixmap(QPixmap(path))进行绘图展示。

    def dropEvent(self, evn):
        # print(f'鼠标放开 {evn.posF()}')
        path = evn.mimeData().text()
        if path.lower().endswith((".jpg",".jpeg",".png",".bmp")):
            path=path.replace('file:///','')
            print('文件路径:\n' + path)
            #https://blog.csdn.net/weixin_46180132/article/details/118178229
            pixmap = QPixmap(path)
            self.ui.label.setPixmap (pixmap)  # 在label上显示图片
            self.ui.label.setScaledContents (True)  # 让图片自适应label大小

3.3 代码效果

软件界面中各种按钮点击事件效果如下所示:
在这里插入图片描述
拖入图片到软件中的效果如下所示
在这里插入图片描述
本博文相关的代码下载链接为:https://download.csdn.net/download/a486259/88010473

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/737263.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

嵌入式开发之上位机工业风界面实现

在做测控类的嵌入式系统开发时,一个精美的上位机控制软件UI是可以为系统增色不少,一般会采用组态软件来开发,我们来看看下面的界面 是不是非常直观有工业质感,还可以根据实时数据进行动态的显示和动画效果,那这些炫酷的…

自定义切换整行上下位置快捷键

自定义切换整行上下位置快捷键 在File菜单中选择Settings选项,搜索move li 先删掉原来的快捷键 再添加你要设置的快捷键 确认就可以了。

word转Markdown文件的几个方法

word转Markdown文件的几个方法 1、 安装writage 软件,但是writage 需要收费了。 如果只是markdown文本编辑,可以直接安装typora来。 2. 利用Pandoc软件来转换word文件到markdown文件 注意doc文件需要保存docx文件格式才可以使用下面命令行 pandoc &q…

C++多线程学习(十六、STL算法中的并行版本,sequenced_policy)

目录 sequenced_policy 使用代码: 准备 代码 结果: sequenced_policy 增加参数:sequenced_policy提供相应并行版算法 execution::seq并行算法执行可以不并行化execution::par并行算法执行可以并行化execution::par_unseq并行算法执行的可以并行以…

C#基础学习_泛型集合List<T>

C#基础学习_泛型集合List 为什么要使用集合? 数组元素个数是固定的,数组一旦定义,就无法改变元素总数。如果需求变化,则必须修改源码。 如果初始化元素总数非常大,则会造成浪费。 集合的特点: 根据需要动态增加元素个数,没有限制 List泛型集合的存储结构,与数组类似,…

Ceres-Solver 官方文档

Ceres-Solver 官方文档 Non-linear Least Squares1. Introduction2. Hello World!3. Derivatives3.1 Numeric Derivatives3.2 Analytic Derivatives3.3 More About Derivatives 4. Powell’s Function5. Curve Fitting6. Robust Curve Fitting7. Bundle Adjustment8. Other Exa…

hive on spark小文件问题【hive.merge.sparkfiles参数不生效】

hive on spark小文件问题【hive.merge.sparkfiles参数不生效】 我也是查看了我们目前集群的版本是spark是3.2.3版本 hive是3.1.3版本,都是比较新的版本,正常是支持这个参数的 在测试环境中,如果在sql中不使用group by函数其实可以可以生效的…

响应式编程实战(08)-WebFlux,使用注解编程模式构建异步非阻塞服务

1 引言 明确了 Spring 家族中 WebFlux 组件诞生的背景和意义。作为一款新型的 Web 服务开发组件: 充分考虑了与原有 Spring MVC 在开发模式上的兼容性,开发人员仍然可以使用基于注解的编程方式来创建响应式 Web 服务WebFlux 也引入了基于函数式编程的全…

Linux下有名管道mkfifo使用

Linux下实现进程通信的方式有很多种,今天要说的是有名管道,有名管道比命名管道的优势是可以在任何进程之间传递数据。有名管道通信是依赖于管道文件这种特殊类型文件来进行的。 目录 1.mkfifo命令 2.mkfifo库函数 1.mkfifo命令 mkfifo命令可以创建管…

HuilderX 运行到 MUMU模拟器

1.网易官网下载MuMu模拟器,一定要打开MuMu模拟器; MuMu模拟器官方下载https://mumu.163.com/ 2.到MUMU模拟器的安装目录,找到adb.exe在的目录下,复制其路径; 举例 :D:/Program Files/MuMuPlayer-12.0/sh…

CSPM(项目管理专业人员能力评价)和软考有什么区别?

一、国标项目管理(项目管理专业人员能力评级)证书是什么? 《项目管理专业人员能力评价要求》(GB/T 41831-2022)是2022年10月12日开始实施的一项中国国家标准,归口于全国项目管理标准化技术委员会。 《项目…

一种环肽52661-98-0,cyclo(Gly-Ser),环(甘氨酰-L-丝氨酰),氨基酸中间体

资料编辑|陕西新研博美生物科技有限公司小编MISSwu cyclo(Gly-Ser)(CAS号:52661-98-0)一种环肽,一般作为氨基酸中间体,含有甘氨酰和丝氨酰,Ser Serine 丝氨酸,也称β羟基丙氨酸,丝氨…

促进协作、提高生产力:育碧选择Perforce Helix Core的原因

Perforce Helix Core成为育碧(Ubisoft)的主要源代码控制工具已经超过六年了,被团队中的程序员和美术人员在大部分项目中使用。在育碧蒙特利尔工作室,有超过1,200名的开发人员使用Perforce Helix Core来储存源代码和数字资产&#…

Appium xpath定位

xpath应该是最准确的定位方式,不管你有没有id、class或者其他的元素,uiautomator总是可以识别出xpath,因为手机APP的控件布局类似于HTML的树形结构。 如右图所示 xpath很长,显然不可能人手动来对其进行编写,最好的就是…

算法竞赛备赛之经典基础算法训练提升,暑期集训营培训

目录 1.排序 1.1.快速排序 1.2.归并排序 2.二分 2.1.整数 2.2.浮点数 3.高精度 3.1.高精度加法 3.2.高精度减法 3.3.高精度乘法 3.4.高精度除法 4.前缀和 5.差分 6.双指针算法 7.位运算 8.离散化 8.1.unique函数实现 9.区间合并 1.排序 1.1.快速排序 快速排…

vue 运行时正常,打包却报错

解决方法:删除vue-cli 自带的压缩 plugin:OptimizeCssnanoPlugin 具体操作:找到vue.config.再添加如下删除配置

万万没想到!!号称国内Java八股文天花板(典藏版)首次开源

应届毕业生的第一份工作干多久跳槽比较合适? 都说现在应届毕业生找工作跳槽频繁,而所有用人单位都希望招揽的人才能一直在公司里干下去,但是人各有志,作为劳动者的应届毕业生有自主选择职业的权利,这就造成很多应届生…

今天分享:智能ai绘画软件哪个好

在一个遥远的未来,艺术界经历了一场革命性的变革。艺术家们不再依赖传统的画笔和颜料,而是转向了ai绘画工具,这是一种集人工智能和创造力于一身的技术。在这个世界中,我有幸遇到了一个与众不同的艺术家,他的名字叫亚历…

Hubspot为什么这么牛?国内有哪些类似软件

国外CRM圈内,除了大佬Salesforce外,还有HubSpot、Oracle、SAP等知名CRM公司。其中,HubSpot在国外2023年最佳CRM软件排行榜中名列第四,在最佳免费CRM软件排行榜中名列第二,我们先来看下它到底有多优秀,然后再…

Deffie-Hellman 算法

Deffie-Hellman 算法简介 Deffie-Hellman(简称 DH) 密钥交换是最早的密钥交换算法之一,它使得通信的双方能在非安全的信道中安全的交换密钥,用于加密后续的通信消息。 Whitfield Diffie 和 Martin Hellman 于 1976 提出该算法,之后被应用于安…