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)是不管用的. 现在问题来了,我们有一个菜单,它有 ...
随机推荐
- Caffe学习系列(15):添加新层
如何在Caffe中增加一层新的Layer呢?主要分为四步: (1)在./src/caffe/proto/caffe.proto 中增加对应layer的paramter message: (2)在./i ...
- Python 学习笔记二
笔记二 :print 以及基本文件操作 笔记一已取消置顶链接地址 http://www.cnblogs.com/dzzy/p/5140899.html 暑假只是快速过了一遍python ,现在起开始仔 ...
- python 内置速度最快算法(堆排)
import random import time from heapq import heappush, heappop def heapsort(iterable): h = [] for val ...
- django xadmin 插件(1)
1. 插件的作用可以是全局的,也可以是只针对某个模型的.通过其 init_request控制是否加载此插件, demo如下: class SCPCardOverviewPlugin(BaseAdmin ...
- dtw算法优化(重写C语言版本)
1.缩小搜索范围 2.降低内存消耗
- rpm包制作(待实验)
作者:firefoxbug 时间:July 18, 2014 rpm包命名规范 对于rpm包的命名符合如下规范. %{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}.rpm N ...
- 关于 Tomcat 的线程池的理解
默认配置下,Tomcat 会为每个连接器创建一个绑定的线程池(最大线程数 200).在大多数情况下你不需要改这个配置(除非增大最大线程数以满足高负载需要).但是 Tomcat 喜欢在每个工作者线程的 ...
- ui router 介绍
1. 路由规则 rap框架页面路由基于ui-router实现 1.1 ui-router 一个基本的路由状态如下所示: 路由配置: $stateProvider .state('po',{ url:' ...
- FFPlay-noConsole-ver-20160409-snapshot
ESC 退出 0 进度条开关 1 屏幕原始大小 2 屏幕1/2大小 3 屏幕1/3大小 4 屏幕1/4大小 S 下一帧 [ -2秒 ] +2秒 ; -1秒 ' +1秒 下一个帧 -> -5秒 F ...
- Android 支付宝以及微信支付快速接入流程
简介 随着移动支付的普及,越来越多的App采用第三发支付,在这里我们以支付宝为例,做一个快速集成! 一.Android快速实现支付宝支付 1.首先,我们需要前往支付宝开放平台,申请我们的支付功能:ht ...