一、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创建第一个窗体(正规套路)的更多相关文章

  1. PyQt5教程——第一个程序(2)

    用PyQt5写的第一个程序 在这篇PyQt5教程中,我们可以学习一些PyQt5的基础应用. 简单的例子 这是一个显示一个小窗口的简单例子.我们可以做许多这样的窗口.我们可以调整它的窗口尺寸,最大化或最 ...

  2. [译]NeHe教程 - 创建一个OpenGL窗体

    原文: Setting Up An OpenGL Window 欢迎阅读我的OpenGL教程.我是一个热爱OpenGL的普通码农!我第一次听到OpenGL是在3Dfx刚发布他们给Voodoo I显卡的 ...

  3. ASP.NET MVC 5 03 - 安装MVC5并创建第一个应用程序

    不知不觉 又逢年底, 穷的钞票 所剩无几. 朋友圈里 各种装逼, 抹抹眼泪 MVC 继续走起.. 本系列纯属学习笔记,如果哪里有错误或遗漏的地方,希望大家高调指出,当然,我肯定不会低调改正的.(开个小 ...

  4. BI之SSAS完整实战教程3 -- 创建第一个多维数据集

    上一篇我们已经完成了数据源的准备工作,现在我们就开始动手,创建第一个多维数据集(Cube). 文章提纲 使用多维数据集向导创建多维数据集 总结Cube设计器简介 维度细化 总结 一.使用向导创建多维数 ...

  5. 用Firefly创建第一个工程

    原地址:http://blog.csdn.net/uxqclm/article/details/10382097 安装完成之后,在python script包中就存在 firefly-admin的工具 ...

  6. Django 创建第一个项目(转)

    转自(http://www.runoob.com/django/django-first-app.html) 前面写了不少python程序,由于之前都是作为工具用,所以命令行就足够了,最近写的测试用例 ...

  7. [ZETCODE]wxWidgets教程三:第一个窗体程序

    本教程原文链接:http://zetcode.com/gui/wxwidgets/firstprograms/ 翻译:瓶哥 日期:2013年11月27日星期三 邮箱:414236069@qq.com ...

  8. WPF换肤之五:创建漂亮的窗体

    原文:WPF换肤之五:创建漂亮的窗体 换肤效果 经过了前面四章的讲解,我们终于知道了如何拖拉窗体使之改变大小,也知道了如何处理鼠标事件,同时,也知道了如何利用更好的编写方式来编写一个方便实用和维护的换 ...

  9. Angular安装及创建第一个项目

    Angular简介 AngularJS 诞生于2009年,由Misko Hevery 等人创建,后为Google所收购.是一款优秀的前端JS框架,已经被用于Google的多款产品当中.AngularJ ...

随机推荐

  1. 使用OpenXML将Excel内容读取到DataTable中

    前言:前面的几篇文章简单的介绍了如何使用OpenXML创建Excel文档.由于在平时的工作中需要经常使用到Excel的读写操作,简单的介绍下使用 OpenXML读取Excel中得数据.当然使用Open ...

  2. (linux shell)第一章--小试牛刀(上)

    来源:(linux shell)第一章--小试牛刀(上) 从今天開始,我们一起来学习<linux shell脚本攻略>这本书. 1.1简单介绍 shell脚本一般是一个以#!起始的文本文件 ...

  3. JSP内置对象整理(转)

    ① out - javax.servlet.jsp.jspWriter out对象用于把结果输出到网页上. 方法: 1. void clear() ;清除输出缓冲区的内容,但是不输出到客户端. 2. ...

  4. WPF自定义窗体仿新毒霸关闭特效(只能在自定义窗体中正常使用)

    比较简单的一个小功能,和新毒霸类似的效果. 效果代码: bool closeStoryBoardCompleted = false; DoubleAnimation closeAnimation1; ...

  5. Android(java)学习笔记179:BroadcastReceiver之 有序广播和无序广播(BroadcastReceiver优先级)

    之前我们在Android(java)学习笔记178中自定义的广播是无序广播,下面我们要了解一下有序广播:   1.   我们首先了解一下有序广播和无序广播区别和联系? (1) 有序广播> 接受者 ...

  6. chmod -R o+rX /data

    When using  chmod -R o+rx /data , you set the execute permission on all directories as well as files ...

  7. Linux网络相关命令小结

    # ifconfig # ifup/ifdown # route -n # ip link show //显示本机所有接口信息 # traceroute # netstat //查看本机网络连接与后门 ...

  8. winform鼠标滚轮事件

    #region 进入窗体时加载 public FormAlarmInfoQuery() { InitializeComponent(); pictureBox1.ImageLocation = &qu ...

  9. asp.net 调用前台JS调用后台,后台掉前台JS

    C#前台js调用后台代码前台js<script type="text/javascript" language="javascript"> func ...

  10. inner join跟where查询的区别