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

news/2024/12/22 6:11:45/

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控件的对象名称。

from PyQt5.QtWidgets import QMainWindow, QApplication
from PyQt5 import uicclass 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() # 去掉uiapp.exec_()

转py使用 :先将ui文件转换为py文件,然后在代码里调用。优点是在编码时即可知道ui控件的对象名称,并可以在ui-py代码中修改控件的配置;缺点是在每一次修改ui文件后都需要重新生成ui-py文件。推荐使用这种方法,因为虽然麻烦,但支持文件拖拽事件
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_MainWindowclass 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() # 去掉uiapp.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/118178229pixmap = 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.ppmy.cn/news/754836.html

相关文章

在线考试系统设计+源码

付费下载源码:下载地址 压缩包里有2个考试系统源码 页面不同供用户选择,还有2个业务小区系统 通过JSP(Java Server Page)技术和Tomcat服务器搭建的一个在线考试系统的设计与实现。针对目前的教学考核都普遍存在有选择题&#xff0…

自制计算机考试系统,用WPS表格制作考试系统 -电脑资料

目前,标准化考试正大行其道, 本考试系统功能: ★学生除输入姓名外,其余操作都用鼠标完成,非常方便。 ★系统可自动扫描考生姓名、成绩,避免教师手动批阅的辛苦。 ★修改试题库即可更新试题内容。 1.制作试题工作表 1.1表头设计 表头,一般位于工作表的左上部,对整个工作…

SpringBoot教学资料5-SpringBoot一对多查询(带简单前端)

项目展示: 项目结构: SQL: CREATE TABLE t_article (id int(20) NOT NULL AUTO_INCREMENT COMMENT 文章id,title varchar(200) DEFAULT NULL COMMENT 文章标题,content longtext COMMENT 文章内容,PRIMARY KEY (id) ) ENGINEInnoDB AUTO_INCR…

【Linux修炼】开发工具使用

🌇个人主页:平凡的小苏 📚学习格言:命运给你一个低的起点,是想看你精彩的翻盘,而不是让你自甘堕落,脚下的路虽然难走,但我还能走,比起向阳而生,我更想尝试逆风…

简要介绍 | 元学习:学会学习的新途径

注1:本文系“简要介绍”系列之一,仅从概念上对元学习(Meta-Learning)进行非常简要的介绍,不适合用于深入和详细的了解。 元学习:学会学习的新途径 BLOG | Samsung Research 1 背景介绍 元学习(…

【Django-报错处理】form.is_valid()方法报错:KeyError: ‘###‘

最初,报错的form表单验证部分如下: class ChangePwdForm(forms.Form):password1 forms.CharField(requiredTrue, min_length6)password2 forms.CharField(requiredTrue, min_length6)def clean(self):pwd1 self.cleaned_data[password1]pwd2 self.c…

世界时区对照表

时区代表城市标准时间夏令时时区ID(UTC04:30)喀布尔阿富汗标准时间阿富汗夏令时Afghanistan Standard Time(UTC-09:00)阿拉斯加阿拉斯加标准时间阿拉斯加夏令时Alaskan Standard Time(UTC-10:00)阿留申群岛阿留申群岛标准时间阿留申群岛夏令时Aleutian Standard Time(UTC07:00)…

2023第七届河南省高等学校信息安全对抗大赛-御网杯-ISCC2023线下赛-misc(详解-思路-脚本)

芜湖~ 是真累呀 原本一天的时间 硬打了一天半 还是那句话 不评价 各位道友心中自有公论 我misc手又发现一个小小的非预期 哎 没想到线下也有这种情况 欧克 以下是我自己的一些思路和解析 有什么问题或者建议随时都可以联系我 2023第七届河南省高等学校信息安全对抗大赛-御…