Pyqt 中__init__(self,parent==None) parent理解
参考:
在PyQt中,所有class都是从QObject派生而来,QWidget对象就可以有一个parent。这种parent-child关系主要用于两个方面:
- 没有parent的QWidget类被认为是最上层的窗体(通常是MainWindow),由于MainWindow的一些操作生成的新窗体对象,parent都应该指向MainWindow。
- 由于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理解的更多相关文章
- 正确理解Widget::Widget(QWidget *parent) :QWidget(parent)这句话(初始化列表中无法直接初始化基类的数据成员,所以你需要在列表中指定基类的构造函数)
最近有点忙,先发一篇我公众号的文章,以下是原文. /********原文********/ 最近很多学习Qt的小伙伴在我的微信公众号私信我,该如何理解下面段代码的第二行QWidget(parent) ...
- PHP中::、->、self、parent::、$this操作符的区别
在访问PHP类中的成员变量或方法时,如果被引用的变量或者方法被声明成const(定义常量)或者static(声明静态),那么就必须使用操作符::,反之如果被引用的变量或者方法没有被声明成const或者 ...
- 正确理解Widget::Widget(QWidget *parent) :QWidget(parent)这句话
原文:https://zhuanlan.zhihu.com/p/31310536 /********原文********/ 最近很多学习Qt的小伙伴在我的微信公众号私信我,该如何理解下面段代码的第二行 ...
- QT 的 parent 该如何理解
对话框是GUI程序和用户进行简短交互的顶层窗口,所谓顶层窗口即始终在主窗口之上显示.QDialog是Qt所有类型的对话框窗口的基类,它继承于QWidget,是一种容器类型组件. QWidget是所有窗 ...
- php中this、self、parent解析
概述: this:指向类当前对象的指针:self:指向类本身,一般指向类中的静态变量:parent:指向父类的指针,一般使用parent来调用父类的构造函数. 下面通过程序详细介绍: 1.this & ...
- 如何在pyqt中自定义无边框窗口
前言 之前写过很多关于无边框窗口并给窗口添加特效的博客,按照时间线罗列如下: 如何在pyqt中实现窗口磨砂效果 如何在pyqt中实现win10亚克力效果 如何在pyqt中通过调用SetWindowCo ...
- pyqt中使用matplotlib绘制动态曲线
一.项目背景: 看了matplotlib for python developers这本书,基本掌握了在pyqt中显示曲线的做法,于是自己写一个. 二.需求描述: 1)X轴显示时间点,显示长度为1分钟 ...
- pyqt中使用matplotlib绘制动态曲线 – pythonic
一.项目背景: 看了matplotlib for python developers这本书,基本掌握了在pyqt中显示曲线的做法,于是自己写一个. 二.需求描述: 1)X轴显示时间点,显示长度为1分钟 ...
- PyQt中如何隐藏Menu
PyQt中隐藏一个Menu Item,可以通过QAction的setVisible(False)来设置,而QMenu的setVisible(False)是不管用的. 现在问题来了,我们有一个菜单,它有 ...
随机推荐
- C++和C中的函数如何相互调用
今天笔试遇到的一题,当时就写了在函数前声明为C,按C编译. 首先是在C中调用C++函数,包括普通函数,重载函数以及成员函数. 对于普通函数,在C++中声明为extern "C",在 ...
- Java获取新浪微博cookies
import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.F ...
- sublime-text3配置编译php
在sublime-text中配置php的编译环境非常简单,只需要新建一个build system就可以了 步骤: 1. 工具->编译系统->新编译系统,将默认的内容替换为如下代码:蓝字部分 ...
- JavaScript——callback(回调函数
1.回调函数定义 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数.回调函数不是由该函数的实现方直 ...
- bitnami-redmine 安装与插件使用
bitnami-redmine 公司要进行敏捷开发管理,选择Redmine作为管理工具. 而Redmine本身的需要的环境比较麻烦,需要安装mysql,ruby,redmine,apach. Bitn ...
- Nodejs 及 NPM 的安装
Nodejs 及 NPM 的安装,有两种方式: 方式1.Nodejs 及 NPM 一起安装 https://nodejs.org/en/download/ 下载 Windows Installe ...
- c++ 文件utf-8格式
#include <stdio.h> int i = 0; while (i < 20) { i++; WriteLog("d:\\log.txt", ...
- 多国语言文档识别 ABBYY FineReader Corporate v12.0.101.388.7z 绿色破解版
ABBYY 是一家俄罗斯软件公司,在文档识别,数据捕获和语言技术的开发中居世界领先地位.其获奖产品 FineReader OCR 软件可以把静态纸文件和 PDF 文件转换成可管理的电子数据,可以大大节 ...
- eclipse添加字体
1.打开window—>Preferences—>General—>Appeatance—>Colors and Fonts—>Text Font—>Edit 2. ...
- 常用iOS第三方库以及XCode插件介绍
第三方库 CocoaPod CocoaPod并不是iOS上的第三方库 而是大名鼎鼎的第三方库的管理工具 在CocoaPod没有出现之前 第三方库的管理是非常痛苦的 尤其是一些大型的库(比如nimbus ...