[ PyQt入门教程 ] Qt Designer工具的使用

Qt Designer是PyQt程序UI界面的实现工具,使用Qt Designer可以拖拽、点击完成GUI界面设计,并且设计完成的.ui程序可以转换成.py文件供python程序调用。本文主要通过用户登录需求描述Qt Designer工具开发界面的使用方法。

主要内容

  1、Qt Designer程序主界面窗口介绍。

  2、Qt Designer程序实现界面开发的案例。包括使用Qt Designer实现程序Gui开发、使用pyuic5将.ui转换.py程序、信号与槽的配置以及实现、使用pyinstaller转换成可执行程序的完成过程。

环境&工具版本

  Win11+Pyhton3.12 + PyQt 5.11.2

一、Qt Designer工具主界面

  打开路径:${python安装目录}/Lib/site-packages/pyqt5_tools/designer.exe。主界面如下:

 主界面不同区域介绍:

  工具箱 区域:提供GUI界面开发使用的各种基本控件,如单选框、文本框等。可以拖动到新创建的主程序界面。

  主界面区域:用户放置各种从工具箱拖过来的各种控件。模板选项中最常用的就是Widget(通用窗口)和MainWindow(主窗口)。二者区别主要是Widget窗口不包含菜单栏、工具栏等。可以分别创建对比看看。

  对象查看器 区域:查看主窗口放置的对象列表。

  属性编辑器 区域: 提供对窗口、控件、布局的属性编辑功能。比如修改控件的显示文本、对象名、大小等。

  信号/槽编辑器 区域:编辑控件的信号和槽函数,也可以添加自定义的信号和槽函数。

二、Qt Designer基本控件介绍

  Widget Box控件工具箱是按照控件作用类别进行划分的。这里作为实现入门级界面实现,主要介绍最常使用的控件及控件对象相关函数。函数方法知道怎么获取控件输入内容以及如何将后台操作结果输出到界面控件显示的主要函数就可以了。

  

  (1)显示控件。

      Lable:文本标签,显示文本,可以用来标记控件。

      Text Browser:显示文本控件。用于后台命令执行结果显示。

  (2)输入控件,提供与用户输入交互

      Line Edit:单行文本框,输入单行字符串。控件对象常用函数为Text() 返回文本框内容,用于获取输入。setText() 用于设置文本框显示。

      Text Edit:多行文本框,输入多行字符串。控件 对象常用函数同Line Edit控件。

  Combo Box:下拉框列表。用于输入指定枚举值。

  (3)控件按钮,供用户选择与执行 

        Push Button:命令按钮。常见的确认、取消、关闭等按钮就是这个控件。clicked信号一定要记住。clicked信号就是指鼠标左键按下然后释放时会发送信号,从而触发相应操作。

        Radio Button:单选框按钮。

        Check Box:多选框按钮。

三、Qt Designer工具实现

  了解基本控件及作用和获取输入/显示方法后,就可以开始动手实现小需求了。。比如登录界面。获取用户名和密码并显示。。

  打开Qt Designer,开始拖拽控件实现吧。。

  Step1:打开主界面,选择Widget模板

  Step2:从Widget Box工具箱中拖拽2个label、2个line Edit、2个Push Button以及1个Text Browser。拖完后如下:

  Step3:双击各个控件,修改控件名称(对应属性编辑区中的text,可直接双击控件修改)以及对象名称(对应属性编辑区中的objectName)。对象名称一定记得修改。默认生成的label_1、label_2这种名称无法直接判断到底是对应哪个控件。。

  点击菜单栏Form - Prview。预览界面实现效果

Step4:点击File -Save保存实现结果。保存文件名为login.ui。

  Step5:界面开发完成。

将.ui文件转换为.py文件

  使用命令行pyuic5 -o login.py login.ui转换成.py文件。调用格式为pyuic5 -o {输出文件名} {输入designer设计好的.ui后缀界面文件}

执行结果如下:

login.ui的程序代码如下:

# -*- coding: utf-8 -*-# Form implementation generated from reading ui file 'login.ui'
#
# Created by: PyQt5 UI code generator 5.11.3
#
# WARNING! All changes made in this file will be lost!from PyQt5 import QtCore, QtGui, QtWidgetsclass Ui_Form(object):def setupUi(self, Form):Form.setObjectName("Form")Form.resize(549, 199)self.user_label = QtWidgets.QLabel(Form)self.user_label.setGeometry(QtCore.QRect(50, 40, 61, 21))self.user_label.setObjectName("user_label")self.user_lineEdit = QtWidgets.QLineEdit(Form)self.user_lineEdit.setGeometry(QtCore.QRect(130, 40, 113, 20))self.user_lineEdit.setObjectName("user_lineEdit")self.pwd_label = QtWidgets.QLabel(Form)self.pwd_label.setGeometry(QtCore.QRect(50, 80, 54, 12))self.pwd_label.setObjectName("pwd_label")self.pwd_lineEdit = QtWidgets.QLineEdit(Form)self.pwd_lineEdit.setGeometry(QtCore.QRect(130, 70, 113, 20))self.pwd_lineEdit.setObjectName("pwd_lineEdit")self.login_Button = QtWidgets.QPushButton(Form)self.login_Button.setGeometry(QtCore.QRect(50, 110, 75, 23))self.login_Button.setObjectName("login_Button")self.cancel_Button = QtWidgets.QPushButton(Form)self.cancel_Button.setGeometry(QtCore.QRect(160, 110, 75, 23))self.cancel_Button.setObjectName("cancel_Button")self.user_textBrowser = QtWidgets.QTextBrowser(Form)self.user_textBrowser.setGeometry(QtCore.QRect(270, 30, 221, 101))self.user_textBrowser.setObjectName("user_textBrowser")self.retranslateUi(Form)QtCore.QMetaObject.connectSlotsByName(Form)def retranslateUi(self, Form):_translate = QtCore.QCoreApplication.translateForm.setWindowTitle(_translate("Form", "用户登录"))self.user_label.setText(_translate("Form", "用户名"))self.pwd_label.setText(_translate("Form", "密码"))self.login_Button.setText(_translate("Form", "登录"))self.cancel_Button.setText(_translate("Form", "退出"))

界面与业务逻辑分离实现

  这一步主要实现业务逻辑,也就是点击登录和退出按钮后程序要执行的操作。为了后续维护方便,采用界面与业务逻辑相分离来实现。也就是通过创建主程序调用界面文件方式实现。这有2个好处。第1就是实现逻辑清晰。第2就是后续如果界面或者逻辑需要变更,好维护。新建call_login.py文件程序,调用login.py文件。

# -*- coding: utf-8 -*-# Form implementation generated from reading ui file 'connect_me.ui'
#
# Created by: PyQt5 UI code generator 5.11.3
#
# WARNING! All changes made in this file will be lost!
#导入程序运行必须模块
import sys
#PyQt5中使用的基本控件都在PyQt5.QtWidgets模块中
from PyQt5.QtWidgets import QApplication, QMainWindow
#导入designer工具生成的login模块
from login import Ui_Formclass MyMainForm(QMainWindow, Ui_Form):def __init__(self, parent=None):super(MyMainForm, self).__init__(parent)self.setupUi(self)if __name__ == "__main__":#固定的,PyQt5程序都需要QApplication对象。sys.argv是命令行参数列表,确保程序可以双击运行app = QApplication(sys.argv)#初始化myWin = MyMainForm()#将窗口控件显示在屏幕上myWin.show()#程序运行,sys.exit方法确保程序完整退出。sys.exit(app.exec_())

运行call_login.py程序,结果如下:

  到这里,界面实现和业务主程序已经写好了。但是现在具体业务功能逻辑还未实现。需要对登录和退出的按钮点击执行相对应的操作。

 四、添加信号和槽,实现业务逻辑

  实现部分见代码注释。这里主要添加如下两行命令配置信号和槽的关系。信号和槽的创建和原理下文描述。这里可以参照添加即可。

   登录按钮:self.login_Button.clicked.connect(self.display)

   退出按钮:self.cancel_Button.clicked.connect(self.close)

  详细代码如下:

# -*- coding: utf-8 -*-# Form implementation generated from reading ui file 'connect_me.ui'
#
# Created by: PyQt5 UI code generator 5.11.3
#
# WARNING! All changes made in this file will be lost!
#导入程序运行必须模块
import sys
#PyQt5中使用的基本控件都在PyQt5.QtWidgets模块中
from PyQt5.QtWidgets import QApplication, QMainWindow
#导入designer工具生成的login模块
from login import Ui_Formclass MyMainForm(QMainWindow, Ui_Form):def __init__(self, parent=None):super(MyMainForm, self).__init__(parent)self.setupUi(self)#添加登录按钮信号和槽。注意display函数不加小括号()self.login_Button.clicked.connect(self.display)#添加退出按钮信号和槽。调用close函数self.cancel_Button.clicked.connect(self.close)def display(self):#利用line Edit控件对象text()函数获取界面输入username = self.user_lineEdit.text()password = self.pwd_lineEdit.text()#利用text Browser控件对象setText()函数设置界面显示self.user_textBrowser.setText("登录成功!\n" + "用户名是: "+ username+ ",密码是: "+ password)if __name__ == "__main__":#固定的,PyQt5程序都需要QApplication对象。sys.argv是命令行参数列表,确保程序可以双击运行app = QApplication(sys.argv)#初始化myWin = MyMainForm()#将窗口控件显示在屏幕上myWin.show()#程序运行,sys.exit方法确保程序完整退出。sys.exit(app.exec_())

运行结果如下:

用户登录小程序开发完成。但是这个界面还有一个小问题,就是拖动的时候,界面会变形。看图

   看到这里,友友们是不是觉得不可忍受,有两个办法,一种是界面点击使用网格布局,一种是使界面大小不可改变。这里介绍第二种方法。在Qt Designer上修改主界面最大属性中的长宽设置成与最小属性一致。如下:

  这样设置之后,就不允许在窗口左右两边拖动导致界面改变大小,就可以保证主界面中的控件不会变形。

五、Pyinstaller打包成.exe文件

  用户登录显示程序界面和逻辑都实现了。下来就是要推广使用了。不是所有人电脑上都安装有python软件或者对应的python版本以及PyQt5工具。那么如何让程序在这些未安装python软件的机子上运行呢?可以使用pyinstaller工具将程序打包成.exe文件。pyinstaller使用方法可以参考《使用Pyinstaller转换.py文件为.exe可执行程序》。打包过程如下:

pyinstaller.exe -F call_login.py -w

打包成功后call_login.exe在当前目录的dist目录下。执行call_login.exe,程序可以正确运行。如下:

  这样,其他人想运行友友你的程序,就可以直接给他提供call_login.exe可执行过程序了。

小结

  小北这篇博客主要讲述了使用Qt Designer工具实现一个用户登录显示的小需求。通过这个需求可以知道如何使用Qt Designer实现界面开发、.ui文件转换、业务和界面分离实现以及最简单的信号和槽创建。通过这个需求实现过程描述相信友友你可以参考动手实现自己的小需求,起码可以上手实践了~

   实际上这个程序还有很多小问题。因为用户登录界面控件少,所以没有感觉出来,就是控件布局管理,就是如何让界面上的控件整齐有序、布局合理美观。还有信号与槽也没具体说明,友友们请期待小北的下一篇文章描述把~

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

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

相关文章

从濒临破产到玩具行业天花板,乐高怎么做到的?

成立于1932年的乐高一开始只是儿童玩具,到现在也俘获了许多大人的心,然而在2003年乐高遇到了巨大的经营危机,离破产只有一一步之遥,然而在当下,乐高已经成功跻身世界500强。今天媒介盒子就来和大家聊聊:从濒…

Server/PC 稳定性测试(Windows)

Server/PC 稳定性测试 1. CPU - 中央处理器1.1 CPU稳定性1.2 CPU温度 2. Memory - 内存2.1 内存性能 3. DISK - 硬盘3.1 HDD - 机械硬盘机械硬盘转速详解监测工具 3.2 SSD - 固态硬盘监测工具 4. 使用时长cpu能用多久?主板能用多久?内存能用多久&#xf…

主键、外键、建表范式、MySQL索引、用户管理

1 案例1:主键 1.1 问题 完成如下练习: 练习主键的创建、查看、删除、添加、验证主键练习复合主键的使用练习与auto_increment连用的效果 1.2 方案 主键使用规则: 表头值不允许重复,不允许赋NULL值一个表中只能有一个primary…

第二篇:新建node项目并运行

🎬 江城开朗的豌豆:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 📝 个人网站 :《 江城开朗的豌豆🫛 》 ⛺️ 生活的理想,就是为了理想的生活 ! 安装 Node.js:首先,确保你的…

【Java】后端开发语言Java和C#,两者对比注解和属性的区别以及作用

欢迎来到《小5讲堂》 大家好,我是全栈小5。 这是《Java》序列文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对知识点的理解和掌握…

音视频-SDL的简单使用

使用SDL进行音视频的播放 SDL(Simple DirectMedia Layer)是一套开放源代码的跨平台多媒体开发库,使用C语言写成。SDL提供了数种控制图像、声音、输出入的函数,让开发者只要用相同或是相似的代码就可以开发出跨多个平台&#xff0…

hnswlib报错ItemCannotBeInsertedIntoTheVectorSpaceException

异常信息 com.stepstone.search.hnswlib.jna.exception.ItemCannotBeInsertedIntoTheVectorSpaceExceptionat com.stepstone.search.hnswlib.jna.Index.checkResultCode(Index.java:247)at com.stepstone.search.hnswlib.jna.Index.addItem(Index.java:125)原因是初始化index环…

抖音SEO搜索排名优化培训教程课件

【干货资料持续更新,以防走丢】 抖音SEO搜索排名优化培训教程课件 部分资料预览 资料部分是网络整理,仅供学习参考。 抖音运营资料合集 (完整资料包含以下内容) 目录 抖音易爆单的商品特征 抖音作为一款短视频平台,…

【应用方案】基于MT7628 JN5169 和SUN724的4G-Zigbee智能网关方案

产品方案特性 - 4G-Zigbee智能网关扩展性强; - 百兆以太网接入; - 支持Zigbee 3.0智能家居产品和智能安防产品接入; - 实时检测烟感、气感,联动阀门控制器可自动关闭燃气阀门,并拨打报警电话,防止火灾&…

静态住宅代理与动态住宅代理的区别?如何选?

住宅代理ip分类两种类型:静态住宅代理和动态住宅代理,他们有什么区别又能用在什么场景呢?我们先从他们是如何运作开始。 一、什么是住宅代理ip isp住宅代理ip我们称为真人住宅代理,地址是从真人/家庭中出发,安全性更高…

游戏素材永不缺,免费在线AI工具Scenario功能齐全,简单易用

Scenario是一个在线的AI驱动的工具,主要用于游戏艺术创作。它提供了一套全面的功能,旨在帮助游戏开发者创建与其独特风格和艺术方向相符的独特、高质量的游戏艺术。Scenario的突出特点之一是它的微调能力,允许用户根据独特的风格和艺术方向训…

Qt单个字符判断

1.相关说明 字符的Unicode编码、单个字符的判断 2.界面绘制 3.相关主要代码 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui;…

【AIGC入门一】Transformers 模型结构详解及代码解析

Transformers 开启了NLP一个新时代,注意力模块目前各类大模型的重要结构。作为刚入门LLM的新手,怎么能不感受一下这个“变形金刚的魅力”呢? 目录 Transformers ——Attention is all You Need 背景介绍 模型结构 位置编码 代码实现&…

Agent检索增强生成

检索增强生成(RAG)设计模式通常用于在特定数据域中开发大语言模型(LLM)应用。然而,RAG的过往的研究重点主要在于提高检索工具的效率,例如嵌入搜索、混合搜索和微调嵌入,而忽视了智能搜索。本文介绍了一种受人类研究方法启发的新方法&#xff…

for循环判断有几个偶数

num100 count0 for i in range(1,num):if i%20:print("为偶数")count1 print(f"1-100的范围内,有{count}个偶数") 运行结果如下:

代码随想录Day21 | 530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数 236. 二叉树的最近公共祖先

代码随想录Day21 | 530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数 236. 二叉树的最近公共祖先 二叉搜索树的最小绝对差二叉搜索树中的众数二叉树的最近公共祖先 二叉搜索树的最小绝对差 文档讲解:代码随想录 视频讲解: 二叉搜索树中,需…

Nginx Ingress轻松上手 | Kubernetes服务管理指南

1. 揭秘Nginx Ingress的魔力 Nginx Ingress是你Kubernetes集群中的得力助手,无需额外安装,已内置于K8s。作为基于Nginx的扩展,它担任负载均衡器和入口控制器的重要角色。 2. 为何选择Nginx Ingress? 2.1 服务曝露的便利 通过简…

Kaggle之旅1

Kaggle之旅1 文章目录 Kaggle之旅1前言一、目标?二、课程1 pandas1. 学和练2. 一些关键摘要 总结 前言 Kaggle是一个以数据科学竞赛为主题的在线平台。它提供了一个数据科学社区,让数据科学家和机器学习专家可以在这里交流、学习和竞争。Kaggle上有大量…

深度掌握 Nginx Ingress:解锁高级功能,打造 Kubernetes 中的流量掌控艺术

前言 在 Kubernetes 的世界里,Nginx Ingress 不仅是流量的门卫,更是一把强大的调控利器。我们已经领略了其基础面貌,现在让我们踏上深度之旅,揭示 Nginx Ingress 的高级功能,助你在 Kubernetes 中创造流量掌控的艺术。…

2024秋招,深信服测试开发工程师一面

前言 回顾一下我秋招参加的第一次线下面试 这个面试体现出了我的很多弱点,也为我后面的改进起着很重要的作用 时间:40min 平台:线下面试 过程 1、个人介绍 2、项目经历 3、团队项目中负责的模块,队友都负责哪些工作&#x…