参考:

在PyQt中,所有class都是从QObject派生而来,QWidget对象就可以有一个parent。这种parent-child关系主要用于两个方面:

  1. 没有parent的QWidget类被认为是最上层的窗体(通常是MainWindow),由于MainWindow的一些操作生成的新窗体对象,parent都应该指向MainWindow。
  2. 由于parent-child关系的存在,它保证了child窗体在主窗体被回收之时也被回收。

parent作为构造函数的最后一个参数被传入,但通常情况下不必显示去指定parent对象。因为当调用局管理器时,部局管理器会自动处理这种parent-child关系。但是在一些特殊的情况下,我们必须显示的指定parent-child关系。如当生成的子类不是QWidget对象但继承了QObject对象,用作dock widgets的QWidget对象。

我们可以看到,对象之间有了依赖和生命周期,把IOC容器运用到GUI编程中是自然而然的事情了。

参考来自: http://blog.csdn.net/thumb3344/article/details/5644789

示例说明:

新建三个文件,分别为 calc.ui 、    calc_logic.py   、  main.py   其中:

calc.ui 为Ui设计文件, 需要转换为calc.py

calc_logic.py 是calc的实现逻辑部分

main.py 是项目的主入口文件

calc.ui 

 <?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>calc</class>
<widget class="QWidget" name="calc">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<widget class="QPushButton" name="pushButton_ok">
<property name="geometry">
<rect>
<x>130</x>
<y>160</y>
<width>75</width>
<height>23</height>
</rect>
</property>
<property name="text">
<string>提示</string>
</property>
</widget>
</widget>
<resources/>
<connections/>
</ui>

我们将calc.ui 转换为calc.py文件

 # -*- coding: utf-8 -*-

 # Form implementation generated from reading ui file 'calc.ui'
#
# Created: Wed Jan 28 11:28:59 2015
# by: PyQt4 UI code generator 4.10.3
#
# WARNING! All changes made in this file will be lost! from PyQt4 import QtCore, QtGui try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
def _fromUtf8(s):
return s try:
_encoding = QtGui.QApplication.UnicodeUTF8
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig) class Ui_calc(object):
def setupUi(self, calc):
calc.setObjectName(_fromUtf8("calc"))
calc.resize(400, 300)
self.pushButton_ok = QtGui.QPushButton(calc)
self.pushButton_ok.setGeometry(QtCore.QRect(130, 160, 75, 23))
self.pushButton_ok.setObjectName(_fromUtf8("pushButton_ok")) self.retranslateUi(calc)
QtCore.QMetaObject.connectSlotsByName(calc) def retranslateUi(self, calc):
calc.setWindowTitle(_translate("calc", "Form", None))
self.pushButton_ok.setText(_translate("calc", "提示", None)) if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
calc = QtGui.QWidget()
ui = Ui_calc()
ui.setupUi(calc)
calc.show()
sys.exit(app.exec_())

新建calc_logic.py 文件,文件内容:

 # -*- coding: utf-8 -*-
from PyQt4 import QtGui, QtCore
from calc import Ui_calc # 引入Ui class calc_logic(QtGui.QWidget):
def __init__(self,parent=None):
super(calc_logic,self).__init__(parent)
self.Ui=Ui_calc() # 实例化 Ui
self.Ui.setupUi(self) # 初始化Ui
self.setWindowTitle('calc_logic Widget') self.connect(self.Ui.pushButton_ok,QtCore.SIGNAL('clicked()'),self.dialogx) def dialogx(self):
if __name__=='__main__':
QtGui.QMessageBox.information(self, (u'提示'),(u' 来自calc_logic文件请求! '),QtGui.QMessageBox.Yes )
elif __name__=='calc_logic':
QtGui.QMessageBox.information(self, (u'提示'),(u' 来自main文件请求! '),QtGui.QMessageBox.Yes ) if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
calc =calc_logic()
calc.show()
sys.exit(app.exec_())

新建入口文件main.py

 # -*- coding: utf-8 -*-
'''
main 主文件
'''
from PyQt4 import QtGui
import sys
from calc_logic import calc_logic # 引入Ui的逻辑文件 class maincalc(QtGui.QWidget):
def __init__(self):
super(maincalc,self).__init__()
self.setWindowTitle('main Widget')
self.Ui=calc_logic(self) # 实例化 calc_logic if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
appcalc =maincalc()
appcalc.show()
sys.exit(app.exec_())

我们先运行calc_logic.py :

然后修改calc_logic.py 中__init__初试方法

 def __init__(self,parent=None):
super(calc_logic,self).__init__(parent)

改为:

 def __init__(self):
super(calc_logic,self).__init__()

修改main.py 初始化calc_logic改为:

 self.Ui=calc_logic()

运行效果:

将mian.py 改回带self参数:

 self.Ui=calc_logic(self)

将clac_logic.py 同样改回带parent参数:

 def __init__(self,parent=None):
super(calc_logic,self).__init__(parent)

在运行main.py :

Pyqt 中__init__(self,parent==None) parent理解的更多相关文章

  1. 正确理解Widget::Widget(QWidget *parent) :QWidget(parent)这句话(初始化列表中无法直接初始化基类的数据成员,所以你需要在列表中指定基类的构造函数)

    最近有点忙,先发一篇我公众号的文章,以下是原文. /********原文********/ 最近很多学习Qt的小伙伴在我的微信公众号私信我,该如何理解下面段代码的第二行QWidget(parent) ...

  2. PHP中::、->、self、parent::、$this操作符的区别

    在访问PHP类中的成员变量或方法时,如果被引用的变量或者方法被声明成const(定义常量)或者static(声明静态),那么就必须使用操作符::,反之如果被引用的变量或者方法没有被声明成const或者 ...

  3. 正确理解Widget::Widget(QWidget *parent) :QWidget(parent)这句话

    原文:https://zhuanlan.zhihu.com/p/31310536 /********原文********/ 最近很多学习Qt的小伙伴在我的微信公众号私信我,该如何理解下面段代码的第二行 ...

  4. QT 的 parent 该如何理解

    对话框是GUI程序和用户进行简短交互的顶层窗口,所谓顶层窗口即始终在主窗口之上显示.QDialog是Qt所有类型的对话框窗口的基类,它继承于QWidget,是一种容器类型组件. QWidget是所有窗 ...

  5. php中this、self、parent解析

    概述: this:指向类当前对象的指针:self:指向类本身,一般指向类中的静态变量:parent:指向父类的指针,一般使用parent来调用父类的构造函数. 下面通过程序详细介绍: 1.this & ...

  6. 如何在pyqt中自定义无边框窗口

    前言 之前写过很多关于无边框窗口并给窗口添加特效的博客,按照时间线罗列如下: 如何在pyqt中实现窗口磨砂效果 如何在pyqt中实现win10亚克力效果 如何在pyqt中通过调用SetWindowCo ...

  7. pyqt中使用matplotlib绘制动态曲线

    一.项目背景: 看了matplotlib for python developers这本书,基本掌握了在pyqt中显示曲线的做法,于是自己写一个. 二.需求描述: 1)X轴显示时间点,显示长度为1分钟 ...

  8. pyqt中使用matplotlib绘制动态曲线 – pythonic

    一.项目背景: 看了matplotlib for python developers这本书,基本掌握了在pyqt中显示曲线的做法,于是自己写一个. 二.需求描述: 1)X轴显示时间点,显示长度为1分钟 ...

  9. PyQt中如何隐藏Menu

    PyQt中隐藏一个Menu Item,可以通过QAction的setVisible(False)来设置,而QMenu的setVisible(False)是不管用的. 现在问题来了,我们有一个菜单,它有 ...

随机推荐

  1. OSI参考模型与TCP/IP协议模型

    OSI和TCP/IP都是为了计算机之间更好的互联的. 计算机网络是一个复杂的系统,比如两台计算机进行通信不仅仅只是有一条通信线就可以了. 还有很多的工作需要完成,例如: 如何知道对方计算机是否做好准备 ...

  2. python自动化之装饰器

    1 高阶函数 满足下列条件之一就可成函数为高阶函数 某一函数当做参数传入另一个函数中 函数的返回值包含n个函数,n>0 高阶函数示范 def bar(): print 'in the bar' ...

  3. xargs命令

    xargs命令 常用工具命令 xargs命令是给其他命令传递参数的一个过滤器,也是组合多个命令的一个工具.它擅长将标准输入数据转换成命令行参数,xargs能够处理管道或者stdin并将其转换成特定命令 ...

  4. iOS 深入理解UINavigationController 和 UIViewController 之间的关系

    创建三个类 BasicViewController : UIViewController SecondViewController : UIViewController ThirdViewContro ...

  5. ORM框架Entity Framework

    博客园在推广ORM方面的确做了很大的贡献,很多的程序员开始使用ORM,不用写SQL的喜悦让他们激动不已,可是好景不长,他们很快发现众多的烦恼一个接一个的出现了. 很遗憾,我并不打算在这篇文章中解决这些 ...

  6. http apr 8080 exec 3解决

    IDEA运行tomcat,总是出现这个错误. 解决: 在tomcat的配置里,加上下面这句话: -Xms256m -Xmx512m -XX:MaxNewSize=64m -XX:MaxPermSize ...

  7. hdu2196

    基本的树形dp,需要dfs三次,第一次求每个点最远的后代,第二次和第三次每个点的孩子分别从左到右和从右到左遍历. #include <cstdio> #include <vector ...

  8. codecademy-command line-inputoutput

    What happens when you type this command? $ echo "Hello" Hello The echo command accepts the ...

  9. Base64编码格式详解

    什么是Base64? 按照RFC2045的定义,Base64被定义为:Base64内容传送编码被设计用来把任意序列的8位字节描述为一种不易被人直接识别的形式.(The Base64 Content-T ...

  10. JS 基础 入门

    JS做弹窗效果 //单行注释/*多行注释*/// 网页 标签语言    js语言是脚本语言/* 数据类型: 容器 1.整型  (int)  2.小数类型: float: 单精度的小数: double: ...