参考:

在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. C++和C中的函数如何相互调用

    今天笔试遇到的一题,当时就写了在函数前声明为C,按C编译. 首先是在C中调用C++函数,包括普通函数,重载函数以及成员函数. 对于普通函数,在C++中声明为extern "C",在 ...

  2. Java获取新浪微博cookies

    import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.F ...

  3. sublime-text3配置编译php

    在sublime-text中配置php的编译环境非常简单,只需要新建一个build system就可以了 步骤: 1. 工具->编译系统->新编译系统,将默认的内容替换为如下代码:蓝字部分 ...

  4. JavaScript——callback(回调函数

    1.回调函数定义 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数.回调函数不是由该函数的实现方直 ...

  5. bitnami-redmine 安装与插件使用

    bitnami-redmine 公司要进行敏捷开发管理,选择Redmine作为管理工具. 而Redmine本身的需要的环境比较麻烦,需要安装mysql,ruby,redmine,apach. Bitn ...

  6. Nodejs 及 NPM 的安装

    Nodejs 及 NPM 的安装,有两种方式: 方式1.Nodejs 及 NPM  一起安装 https://nodejs.org/en/download/  下载  Windows Installe ...

  7. c++ 文件utf-8格式

    #include <stdio.h> int i = 0; while (i < 20) {    i++;    WriteLog("d:\\log.txt", ...

  8. 多国语言文档识别 ABBYY FineReader Corporate v12.0.101.388.7z 绿色破解版

    ABBYY 是一家俄罗斯软件公司,在文档识别,数据捕获和语言技术的开发中居世界领先地位.其获奖产品 FineReader OCR 软件可以把静态纸文件和 PDF 文件转换成可管理的电子数据,可以大大节 ...

  9. eclipse添加字体

    1.打开window—>Preferences—>General—>Appeatance—>Colors and Fonts—>Text Font—>Edit 2. ...

  10. 常用iOS第三方库以及XCode插件介绍

    第三方库 CocoaPod CocoaPod并不是iOS上的第三方库 而是大名鼎鼎的第三方库的管理工具 在CocoaPod没有出现之前 第三方库的管理是非常痛苦的 尤其是一些大型的库(比如nimbus ...