PyQt5创建第一个窗体(正规套路)
一、Pyqt5 创建第一个窗体
很多人写窗体程序都是直接敲代码,不使用设计器,我个人不是很赞成这种做法。使用设计器的好处是直观、维护方便,尤其开发复杂窗体的效率高。
但是每次修改ui文件后,需要重新生成py文件,会将原来的内容覆盖掉,为了避免这种情况,引入了一个中间类。主要步骤如下:
1使用QtDesigner创建一个简单的对话框,保存成simpleDialog.ui。
2使用cmd,进入simpleDialog.ui文件所在的目录,运行命令pyuic5 simpleDialog.ui >ui_simpleDialog.py
3打开ui_simpleDialog.py,pyqt自动生成的代码如下(无需任何修改):
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Form(object):#注意pyqt5窗体从object继承,不是QMainWindow了
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(400, 300)
self.pushButton = QtWidgets.QPushButton(Form)
self.pushButton.setGeometry(QtCore.QRect(60, 70, 241, 131))
self.pushButton.setObjectName("pushButton")
self.retranslateUi(Form)
self.pushButton.clicked.connect(Form.close)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "Form"))
self.pushButton.setText(_translate("Form", "PushButton"))
可以看到刚才新建的对话框的类名称是”Ui_Form”。
4新建一个simpleDialog.py文件,编写代码如下:
from PyQt5 import QtCore, QtGui, QtWidgets
from ui_simpledialog import Ui_Form
import sys
class SimpleDialogForm(Ui_Form):#从自动生成的界面类继承
def __init__(self, parent = None):
super(SimpleDialogForm, self).__init__()
def yourFunctions(self):
Pass
#这个类中处理你自己的业务逻辑。界面ui可随心所欲的修改,不影响你已经编写的逻辑。
自定义一个类(SimpleDialogForm)继承自pyqt自动生成的类,然后覆写”构造函数”,剩余的工作就是你自己想要添加的功能了。
5完善运行测试代码,如下:
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
main = QtWidgets.QMainWindow()#创建一个主窗体(必须要有一个主窗体)
content = SimpleDialogForm()#创建对话框
content.setupUi(main)#将对话框依附于主窗体
main.show()#主窗体显示
sys.exit(app.exec_())
6为什么要这么做?
基于界面与实现分离的原则,我们使用QtDesigner设计的窗体,仅仅作为界面使用,具体业务逻辑通过单独的文件实现,这样以后如果界面发生变动,pyqt自动生成窗体代码时不会覆盖掉我们已经编写的业务逻辑。
7推荐的做法:
为了有良好的封装性,将中间类修改为:
class SimpleDialogForm(Ui_Form, QtWidgets.QMainWindow):
def __init__(self, parent = None):
super(SimpleDialogForm, self).__init__()
self.setupUi(self)#在此设置界面
#在此,可添加自定义的信号绑定
self.pushButton.clicked.connect(self.openFile)
self.pushButton_2.clicked.connect(self.closeApp)
测试代码这样写:
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
main = SimpleDialogForm()
main.show()#在外面只需要调用simpleDialogForm显示就行,不需要关注内部如何实现了。
sys.exit(app.exec_())
PyQt5创建第一个窗体(正规套路)的更多相关文章
- PyQt5教程——第一个程序(2)
用PyQt5写的第一个程序 在这篇PyQt5教程中,我们可以学习一些PyQt5的基础应用. 简单的例子 这是一个显示一个小窗口的简单例子.我们可以做许多这样的窗口.我们可以调整它的窗口尺寸,最大化或最 ...
- [译]NeHe教程 - 创建一个OpenGL窗体
原文: Setting Up An OpenGL Window 欢迎阅读我的OpenGL教程.我是一个热爱OpenGL的普通码农!我第一次听到OpenGL是在3Dfx刚发布他们给Voodoo I显卡的 ...
- ASP.NET MVC 5 03 - 安装MVC5并创建第一个应用程序
不知不觉 又逢年底, 穷的钞票 所剩无几. 朋友圈里 各种装逼, 抹抹眼泪 MVC 继续走起.. 本系列纯属学习笔记,如果哪里有错误或遗漏的地方,希望大家高调指出,当然,我肯定不会低调改正的.(开个小 ...
- BI之SSAS完整实战教程3 -- 创建第一个多维数据集
上一篇我们已经完成了数据源的准备工作,现在我们就开始动手,创建第一个多维数据集(Cube). 文章提纲 使用多维数据集向导创建多维数据集 总结Cube设计器简介 维度细化 总结 一.使用向导创建多维数 ...
- 用Firefly创建第一个工程
原地址:http://blog.csdn.net/uxqclm/article/details/10382097 安装完成之后,在python script包中就存在 firefly-admin的工具 ...
- Django 创建第一个项目(转)
转自(http://www.runoob.com/django/django-first-app.html) 前面写了不少python程序,由于之前都是作为工具用,所以命令行就足够了,最近写的测试用例 ...
- [ZETCODE]wxWidgets教程三:第一个窗体程序
本教程原文链接:http://zetcode.com/gui/wxwidgets/firstprograms/ 翻译:瓶哥 日期:2013年11月27日星期三 邮箱:414236069@qq.com ...
- WPF换肤之五:创建漂亮的窗体
原文:WPF换肤之五:创建漂亮的窗体 换肤效果 经过了前面四章的讲解,我们终于知道了如何拖拉窗体使之改变大小,也知道了如何处理鼠标事件,同时,也知道了如何利用更好的编写方式来编写一个方便实用和维护的换 ...
- Angular安装及创建第一个项目
Angular简介 AngularJS 诞生于2009年,由Misko Hevery 等人创建,后为Google所收购.是一款优秀的前端JS框架,已经被用于Google的多款产品当中.AngularJ ...
随机推荐
- 会话数据的保存——cookie
会话的理解 可以简单的理解为:用户打开浏览器,访问多个web资源,然后关闭浏览器,这个过程可以称为一次会话 有状态会话:可以简单理解为一个同学来了这个教室,下一次再来我们知道他来过这个教室,我们可以称 ...
- jquery mobile图片自适应屏幕
jquery mobile中如果不给img标签指定宽度的话,无法达到自适应屏幕的效果,特此备注:width:100%;
- java-常用快捷键
alt+/:代码提示 ctrl+/:代码提示 ctrl+1:快速生成impl代码
- MySQLdb安装和使用2
http://blog.chinaunix.net/uid-8487640-id-3183185.html MySQLdb是Python连接MySQL的模块,下面介绍一下源码方式安装MySQLdb: ...
- HttpServlet请求重定向
方法一: public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletExcep ...
- Java基础知识强化之集合框架笔记48:产生10个1~20之间的随机数(要求:随机数不能重复) 简洁版
1. 编写一个程序,获取10个1至20的随机数,要求随机数不能重复. 分析: A: 创建随机数对象 B: 创建一个HashSet集合 C: 判断集合的长度是不是小于10 是:就创建一个随机 ...
- a标签中的href="#"与href="javascript:void(0)"区别
转自http://blog.csdn.net/fightplane/article/details/5190037 <a href="#"> 点击链接后,页面会向上滚到 ...
- Install-User.ps1
Install-User.ps1 function Install-User { param( [Parameter()] [string]$ComputerName = $env:computern ...
- Linux中Curl命令couldn't connect to host解决方案 php操作Curl(http,https)无法获取远程数据解决方案
本人在做百度账户第三方登录接口,获取百度token,利用php操作curl post方式发送请求token,出现couldn't connect to host错误.经过调试测试,最后终于成功.回头写 ...
- wps批量使标题靠文档左边