PyQt6 使用Qt Designer实现简单的界面,以及ui文件转py文件

前言,主要通过参考并总结两篇文章中的部分内容,参考文章一 && 参考文章二

Qt 设计师简单例子

  • 一、需求分析
  • 二、界面设计
  • 三、生成ui文件
  • 四、ui文件转py文件
    • 1、命令行 执行 uic 生成 py代码
    • 2、PyCharm 配置 Pyuic工具
      • 2.1 配置Pyuic工具
      • 2.2 测试是否配置成功
  • 五、运行ui文件所转的py文件
  • 六、功能实现
    • 1、编写代码
    • 2、运行代码

一、需求分析

新增一个用户注册界面,包含用户名,密码,性别,手机号,点击注册按钮时,弹出一个对话框,提示恭喜 “{用户输入的用户名}” 注册成功。但是无奈还没找出获取最新输入用户名的值,就简单做个例子,随意了。大家可以自己尝试。

二、界面设计

  • 打开Qt Designer工具,如下图所示:
    在这里插入图片描述
  • 新建一个Main Window窗体,接着拖拉界面组件到Main Window窗体中,我这边拖拉好了,如下图所示:
    在这里插入图片描述

三、生成ui文件

  • 接着ctrl+s保存ui文件,这边我保存到PyQt项目底下,并命名为register.ui文件,如下图所示:
    在这里插入图片描述

  • 接着新建一个ui包,在com.lyx包底下,把register.ui放进去,代码目录结构如下:
    在这里插入图片描述

  • 打开register.ui文件,内容是一个xml格式,帮我们自动生成了,突然觉得有点像大学时期学的android,代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"><class>MainWindow</class><widget class="QMainWindow" name="MainWindow"><property name="geometry"><rect><x>0</x><y>0</y><width>800</width><height>600</height></rect></property><property name="windowTitle"><string>MainWindow</string></property><widget class="QWidget" name="centralwidget"><widget class="QLabel" name="label"><property name="geometry"><rect><x>250</x><y>150</y><width>54</width><height>16</height></rect></property><property name="text"><string>用户名:</string></property></widget><widget class="QTextEdit" name="textEdit"><property name="geometry"><rect><x>320</x><y>140</y><width>221</width><height>31</height></rect></property><property name="html"><string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;meta charset=&quot;utf-8&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
hr { height: 1px; border-width: 0; }
li.unchecked::marker { content: &quot;\2610&quot;; }
li.checked::marker { content: &quot;\2612&quot;; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Microsoft YaHei UI'; font-size:9pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;请输入用户名&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string></property></widget><widget class="QLabel" name="label_2"><property name="geometry"><rect><x>250</x><y>200</y><width>54</width><height>16</height></rect></property><property name="text"><string>密码:</string></property></widget><widget class="QTextEdit" name="textEdit_2"><property name="geometry"><rect><x>320</x><y>190</y><width>221</width><height>31</height></rect></property><property name="html"><string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;meta charset=&quot;utf-8&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
hr { height: 1px; border-width: 0; }
li.unchecked::marker { content: &quot;\2610&quot;; }
li.checked::marker { content: &quot;\2612&quot;; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Microsoft YaHei UI'; font-size:9pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;请输入密码&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string></property></widget><widget class="QLabel" name="label_3"><property name="geometry"><rect><x>250</x><y>240</y><width>54</width><height>16</height></rect></property><property name="text"><string>性别:</string></property></widget><widget class="QRadioButton" name="radioButton"><property name="geometry"><rect><x>320</x><y>240</y><width>41</width><height>20</height></rect></property><property name="text"><string></string></property></widget><widget class="QRadioButton" name="radioButton_2"><property name="geometry"><rect><x>370</x><y>240</y><width>51</width><height>20</height></rect></property><property name="text"><string></string></property></widget><widget class="QLabel" name="label_4"><property name="geometry"><rect><x>250</x><y>280</y><width>54</width><height>16</height></rect></property><property name="text"><string>手机号:</string></property></widget><widget class="QTextEdit" name="textEdit_3"><property name="geometry"><rect><x>320</x><y>270</y><width>221</width><height>31</height></rect></property><property name="html"><string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;meta charset=&quot;utf-8&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
hr { height: 1px; border-width: 0; }
li.unchecked::marker { content: &quot;\2610&quot;; }
li.checked::marker { content: &quot;\2612&quot;; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Microsoft YaHei UI'; font-size:9pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;请输入手机号&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string></property></widget><widget class="QPushButton" name="pushButton"><property name="geometry"><rect><x>360</x><y>340</y><width>75</width><height>24</height></rect></property><property name="text"><string>注册</string></property></widget></widget><widget class="QMenuBar" name="menuBar"><property name="geometry"><rect><x>0</x><y>0</y><width>800</width><height>22</height></rect></property><property name="defaultUp"><bool>false</bool></property><widget class="QMenu" name="menu"><property name="title"><string>注册页面 </string></property></widget><addaction name="menu"/></widget><widget class="QStatusBar" name="statusbar"/></widget><resources/><connections/>
</ui>

四、ui文件转py文件

这种界面文件要应用到Python程序中,需要把它转成.py格式文件,有两种方式,但是实现都是通过pyuic。

第一种用命令行执行uic,第二种PyCharm配置pyuic,设置其运行程序、参数和工作目录,下面依次介绍:

1、命令行 执行 uic 生成 py代码

  • 首先,进入刚才放置register.ui的目录,在终端执行命令:
cd PyQt/com/lyx/ui
  • 接着,执行命令:
python -m PyQt6.uic.pyuic register.ui -o register.py
  • 可以看到,此时包底下,生成多一个register.py文件,如下图所示:
    在这里插入图片描述
  • 代码如下:
# Form implementation generated from reading ui file 'register.ui'
#
# Created by: PyQt6 UI code generator 6.4.2
#
# WARNING: Any manual changes made to this file will be lost when pyuic6 is
# run again.  Do not edit this file unless you know what you are doing.from PyQt6 import QtCore, QtGui, QtWidgetsclass Ui_MainWindow(object):def setupUi(self, MainWindow):MainWindow.setObjectName("MainWindow")MainWindow.resize(800, 600)self.centralwidget = QtWidgets.QWidget(parent=MainWindow)self.centralwidget.setObjectName("centralwidget")self.label = QtWidgets.QLabel(parent=self.centralwidget)self.label.setGeometry(QtCore.QRect(250, 150, 54, 16))self.label.setObjectName("label")self.textEdit = QtWidgets.QTextEdit(parent=self.centralwidget)self.textEdit.setGeometry(QtCore.QRect(320, 140, 221, 31))self.textEdit.setObjectName("textEdit")self.label_2 = QtWidgets.QLabel(parent=self.centralwidget)self.label_2.setGeometry(QtCore.QRect(250, 200, 54, 16))self.label_2.setObjectName("label_2")self.textEdit_2 = QtWidgets.QTextEdit(parent=self.centralwidget)self.textEdit_2.setGeometry(QtCore.QRect(320, 190, 221, 31))self.textEdit_2.setObjectName("textEdit_2")self.label_3 = QtWidgets.QLabel(parent=self.centralwidget)self.label_3.setGeometry(QtCore.QRect(250, 240, 54, 16))self.label_3.setObjectName("label_3")self.radioButton = QtWidgets.QRadioButton(parent=self.centralwidget)self.radioButton.setGeometry(QtCore.QRect(320, 240, 41, 20))self.radioButton.setObjectName("radioButton")self.radioButton_2 = QtWidgets.QRadioButton(parent=self.centralwidget)self.radioButton_2.setGeometry(QtCore.QRect(370, 240, 51, 20))self.radioButton_2.setObjectName("radioButton_2")self.label_4 = QtWidgets.QLabel(parent=self.centralwidget)self.label_4.setGeometry(QtCore.QRect(250, 280, 54, 16))self.label_4.setObjectName("label_4")self.textEdit_3 = QtWidgets.QTextEdit(parent=self.centralwidget)self.textEdit_3.setGeometry(QtCore.QRect(320, 270, 221, 31))self.textEdit_3.setObjectName("textEdit_3")self.pushButton = QtWidgets.QPushButton(parent=self.centralwidget)self.pushButton.setGeometry(QtCore.QRect(360, 340, 75, 24))self.pushButton.setObjectName("pushButton")MainWindow.setCentralWidget(self.centralwidget)self.menuBar = QtWidgets.QMenuBar(parent=MainWindow)self.menuBar.setGeometry(QtCore.QRect(0, 0, 800, 22))self.menuBar.setDefaultUp(False)self.menuBar.setObjectName("menuBar")self.menu = QtWidgets.QMenu(parent=self.menuBar)self.menu.setObjectName("menu")MainWindow.setMenuBar(self.menuBar)self.statusbar = QtWidgets.QStatusBar(parent=MainWindow)self.statusbar.setObjectName("statusbar")MainWindow.setStatusBar(self.statusbar)self.menuBar.addAction(self.menu.menuAction())self.retranslateUi(MainWindow)QtCore.QMetaObject.connectSlotsByName(MainWindow)def retranslateUi(self, MainWindow):_translate = QtCore.QCoreApplication.translateMainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))self.label.setText(_translate("MainWindow", "用户名:"))self.textEdit.setHtml(_translate("MainWindow", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
"<html><head><meta name=\"qrichtext\" content=\"1\" /><meta charset=\"utf-8\" /><style type=\"text/css\">\n"
"p, li { white-space: pre-wrap; }\n"
"hr { height: 1px; border-width: 0; }\n"
"li.unchecked::marker { content: \"\\2610\"; }\n"
"li.checked::marker { content: \"\\2612\"; }\n"
"</style></head><body style=\" font-family:\'Microsoft YaHei UI\'; font-size:9pt; font-weight:400; font-style:normal;\">\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">请输入用户名</p></body></html>"))self.label_2.setText(_translate("MainWindow", "密码:"))self.textEdit_2.setHtml(_translate("MainWindow", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
"<html><head><meta name=\"qrichtext\" content=\"1\" /><meta charset=\"utf-8\" /><style type=\"text/css\">\n"
"p, li { white-space: pre-wrap; }\n"
"hr { height: 1px; border-width: 0; }\n"
"li.unchecked::marker { content: \"\\2610\"; }\n"
"li.checked::marker { content: \"\\2612\"; }\n"
"</style></head><body style=\" font-family:\'Microsoft YaHei UI\'; font-size:9pt; font-weight:400; font-style:normal;\">\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">请输入密码</p></body></html>"))self.label_3.setText(_translate("MainWindow", "性别:"))self.radioButton.setText(_translate("MainWindow", "男"))self.radioButton_2.setText(_translate("MainWindow", "女"))self.label_4.setText(_translate("MainWindow", "手机号:"))self.textEdit_3.setHtml(_translate("MainWindow", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
"<html><head><meta name=\"qrichtext\" content=\"1\" /><meta charset=\"utf-8\" /><style type=\"text/css\">\n"
"p, li { white-space: pre-wrap; }\n"
"hr { height: 1px; border-width: 0; }\n"
"li.unchecked::marker { content: \"\\2610\"; }\n"
"li.checked::marker { content: \"\\2612\"; }\n"
"</style></head><body style=\" font-family:\'Microsoft YaHei UI\'; font-size:9pt; font-weight:400; font-style:normal;\">\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">请输入手机号</p></body></html>"))self.pushButton.setText(_translate("MainWindow", "注册"))self.menu.setTitle(_translate("MainWindow", "注册页面 "))
  • 注:这种自动生成的代码,不要去编辑,也不需要编辑,因为界面的修改,再次生成时,会自动覆盖原来的代码,所以我们另外写代码,不要在自动生成的代码里面去写。

2、PyCharm 配置 Pyuic工具

2.1 配置Pyuic工具

  • 在 " File —> Settings —> Tools —> External Tools " 中点击 + 号,添加外部工具。
  • Name 填写为 “Py_UIC”,这个名字可以随意填
  • "Program"中填入 “python.exe” 的路径。
  • Arguments” 中填入 -m PyQt6.uic.pyuic $FileName$ -o $FileNameWithoutExtension$.py
    说明:-m 参数就是 “将 库模块 作为脚本运行”,这里库模块是 PyQt6.uic.pyuic,-o 参数是输出文件名
  • Working directory” 中填入 $FileDir$
    说明:$FileDir$为系统自定义宏参数( 点击 宏参数 时 可以实时显示对应当前工程 的 值 ),如下图所示:
    在这里插入图片描述
  • 所有配置如下图所示:
    在这里插入图片描述

2.2 测试是否配置成功

  • 首先,先把刚才命令行生成的register.py文件删除
  • 接着,.ui文件 —> 右键 -> External Tools —> Py_UIC,即可自动生成 py 文件,如下图所示,配置成功:
    在这里插入图片描述

五、运行ui文件所转的py文件

  • 首先,在test包底下,新建一个register_test.py文件,代码如下:
import sys
from PyQt6 import QtWidgets
from PyQt.com.lyx.ui.register import Ui_MainWindowif __name__ == '__main__':app = QtWidgets.QApplication(sys.argv)  # 创建一个QApplication,也就是你要开发的应用程序mainWindow = QtWidgets.QMainWindow()    # 创建一个QMainWindow,用来装载你需要的各种组件、控件ui = Ui_MainWindow()    # ui是你创建的ui类的实例化对象,这里调用的便是刚才生成的register.py中的Ui_MainWindow类ui.setupUi(mainWindow)  # 执行类中的setupUi方法,方法的参数是第二步中创建的QMainWindowmainWindow.show()   # 执行QMainWindow的show()方法,显示这个QMainWindowsys.exit(app.exec())    # 使用exit()或者点击关闭按钮退出QApplication
  • 运行代码后,如下:
    在这里插入图片描述

六、功能实现

1、编写代码

  • 首先,在test包底下,新建一个my_window_test.py文件,重新写一个class来实现界面需要的逻辑,代码如下:
import sys
from PyQt.com.lyx.ui.register import Ui_MainWindow
from PyQt6.QtWidgets import QMessageBox, QMainWindow, QApplication# 自定义窗口类
# 参数1: QMainWindow 用来装载你需要的各种组件、控件
# 参数2: Ui_MainWindow 通过Qt设计师生成的register.py的窗口类
class MyWindow(QMainWindow, Ui_MainWindow):def __init__(self, parent=None):"""子类的初始化方法,继承QMainWindow父类:param parent:"""QMainWindow.__init__(self, parent=parent)   # 初始化QMainWindow方法self.setupUi(self)  # 调用Ui_MainWindow类的setupUi方法,即register.py底下的setupUi方法,从中获取Ui界面user_name = self.textEdit.toPlainText()     # 获取UI底下的第一个文本框的名称,即用户名,作为参数点击按钮时传递过去self.pushButton.clicked.connect(lambda: self.btnClicked(user_name))     # 注册按钮点击绑定事件,并调用btnClicked方法def btnClicked(self, user_name):"""点击注册按钮时触发事件:param user_name: 用户名:return: 显示一个对话框,展示用户名注册成功,对话框标题为对话框您好"""msg = f'恭喜 {user_name},注册成功'    # 显示信息,参数变量由{}括起来self.statusBar().showMessage(msg)   # 对话框设置信息QMessageBox.information(self, '对话框您好', msg)     # 生成对话框# main 主程序调用方法
if __name__ == '__main__':app = QApplication(sys.argv)    # 生成一个QApplication应用MyWindow = MyWindow()   # 实例化MyWindow对象MyWindow.show()     # 展示MyWindow对话框sys.exit(app.exec())    # 使用exit()或者点击关闭按钮退出QApplication

2、运行代码

  • 运行后,如下图所示:
    在这里插入图片描述

  • 接着点击注册按钮,效果如下:
    在这里插入图片描述

以上内容仅供学习参考,写得不好,敬请见谅。

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

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

相关文章

部署LVS的NET模式

实验准备 #负载调度器# 192.168.116.40 #内网 12.0.0.100 #外网 先添加双网卡 #web服务器# 192.168.116.20 #web1 192.168.116.30 #web2 #nfs共享服务# 192.168.116.10 #nfs systemctl stop firewalld setenforce 0 1.nfs共享文件 1…

Vmare安装Centos8系统

vmare虚拟机Centos8系统安装 之前虚拟机已经安装好了&#xff0c;现在开始尝试在虚拟机里面安装系统&#xff0c;这次使用Centos8进行安装。 前提条件&#xff1a; 虚拟机安装完成 Centos8系统镜像下载完成 网上资源很多&#xff0c;如果没有也可以私信我。 本篇文章全程图片资…

【设计模式--行为型--观察者模式】

设计模式--行为型--观察者模式 观察者模式定义结构案例优缺点使用场景JDK中提供的实现例&#xff1a;警察抓小偷 观察者模式 定义 又被成为发布订阅模式&#xff0c;它定义了一种一对多的依赖关系&#xff0c;让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生…

java基础-1

byte&#xff1a;8位有符号二进制补码整数&#xff0c;占用1字节。 short&#xff1a;16位有符号二进制补码整数&#xff0c;占用2字节。 int&#xff1a;32位有符号二进制补码整数&#xff0c;占用4字节。 long&#xff1a;64位有符号二进制补码整数&#xff0c;占用8字节。…

计算机组成原理—总线

文章目录 总线概述总线的作用串行总线与并向总线总线分类总线结构 总线性能指标总线仲裁集中仲裁链式查询计数器查询独立请求 分布式仲裁 总线操作和计时同步定时方式异步通信半同步通信分离式通信 计组真的太难了&#xff01; 这一章节安排的目的其实是有种亡羊补牢的安排意思…

提前预警,时刻守护:迅软DLP的数据安全先锋

许多数据泄密事件的发生&#xff0c;往往都是由于没有在案发事前做好安全保护&#xff0c;使得重要信息被随意攻击、盗取、泄密。比起在危机发生后亡羊补牢&#xff0c;更重要的是应该在案发之前未雨绸缪。迅软DLP作为迅软股份研发的“重磅选手”&#xff0c;可为政企单位在一切…

uni-app微信小程序隐藏左上角返回按钮

官方文档链接&#xff1a;uni.setNavigationBarTitle(OBJECT) | uni-app官网 (dcloud.net.cn) 首先要明确的是页面间的跳转方式有几种、每一种默认的作用是什么。 uniapp五种跳转方式 第一&#xff1a;wx.navigatorTo 【新页面打开&#xff0c;默认会有返回按钮】第二&#x…

详细了解stm32---按键

提示&#xff1a;永远支持知识文档免费开源&#xff0c;喜欢的朋友们&#xff0c;点个关注吧&#xff01;蟹蟹&#xff01; 目录 一、了解按键 二、stm32f103按键分析 三、按键应用 一、了解按键 同学们&#xff0c;又见面了o(*&#xffe3;▽&#xffe3;*)ブ&#xff0c;最…

使用create-react-app脚手架创建react项目

文章目录 1、安装create-react-app脚手架2、创建 React 项目&#xff0c;项目名为 react-demo3、项目创建成功4、使用vscode打开项目并运行5、项目运行成功node_modules&#xff1a;存放项目所依赖的一些第三方包文件public&#xff1a;静态资源文件夹src:源码文件夹其它文件 1…

leetcode做题笔记2415. 反转二叉树的奇数层

给你一棵 完美 二叉树的根节点 root &#xff0c;请你反转这棵树中每个 奇数 层的节点值。 例如&#xff0c;假设第 3 层的节点值是 [2,1,3,4,7,11,29,18] &#xff0c;那么反转后它应该变成 [18,29,11,7,4,3,1,2] 。 反转后&#xff0c;返回树的根节点。 完美 二叉树需满足…

CGAL的3D网格参数化

1、介绍 参数化曲面相当于找到一个从合适的域到曲面的单射映射。一个好的映射是在某种意义上最小化角度失真&#xff08;保角参数化&#xff09;或面积失真&#xff08;等面积参数化&#xff09;的映射。在这个包中&#xff0c;我们专注于参数化与圆盘或球体同胚的三角化曲面&a…

vue中使用ailwind css

官网地址&#xff1a; 安装 - Tailwind CSS 中文网 推荐一个网站&#xff0c;里面可以查询所有的TailWindCSS的class样式&#xff1a; Tailwind CSS Cheat Sheet npm安装&#xff1a; 注意&#xff1a;1、这里要用npm&#xff0c;不要用cnpm。2、最好用install&#xff0c;不要…