Pyqt 中__init__(self,parent==None) parent理解

参考:

在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 

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <ui version="4.0">
 3  <class>calc</class>
 4  <widget class="QWidget" name="calc">
 5   <property name="geometry">
 6    <rect>
 7     <x>0</x>
 8     <y>0</y>
 9     <width>400</width>
10     <height>300</height>
11    </rect>
12   </property>
13   <property name="windowTitle">
14    <string>Form</string>
15   </property>
16   <widget class="QPushButton" name="pushButton_ok">
17    <property name="geometry">
18     <rect>
19      <x>130</x>
20      <y>160</y>
21      <width>75</width>
22      <height>23</height>
23     </rect>
24    </property>
25    <property name="text">
26     <string>提示</string>
27    </property>
28   </widget>
29  </widget>
30  <resources/>
31  <connections/>
32 </ui>

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

 1 # -*- coding: utf-8 -*-
 2
 3 # Form implementation generated from reading ui file ‘calc.ui‘
 4 #
 5 # Created: Wed Jan 28 11:28:59 2015
 6 #      by: PyQt4 UI code generator 4.10.3
 7 #
 8 # WARNING! All changes made in this file will be lost!
 9
10 from PyQt4 import QtCore, QtGui
11
12 try:
13     _fromUtf8 = QtCore.QString.fromUtf8
14 except AttributeError:
15     def _fromUtf8(s):
16         return s
17
18 try:
19     _encoding = QtGui.QApplication.UnicodeUTF8
20     def _translate(context, text, disambig):
21         return QtGui.QApplication.translate(context, text, disambig, _encoding)
22 except AttributeError:
23     def _translate(context, text, disambig):
24         return QtGui.QApplication.translate(context, text, disambig)
25
26 class Ui_calc(object):
27     def setupUi(self, calc):
28         calc.setObjectName(_fromUtf8("calc"))
29         calc.resize(400, 300)
30         self.pushButton_ok = QtGui.QPushButton(calc)
31         self.pushButton_ok.setGeometry(QtCore.QRect(130, 160, 75, 23))
32         self.pushButton_ok.setObjectName(_fromUtf8("pushButton_ok"))
33
34         self.retranslateUi(calc)
35         QtCore.QMetaObject.connectSlotsByName(calc)
36
37     def retranslateUi(self, calc):
38         calc.setWindowTitle(_translate("calc", "Form", None))
39         self.pushButton_ok.setText(_translate("calc", "提示", None))
40
41
42 if __name__ == "__main__":
43     import sys
44     app = QtGui.QApplication(sys.argv)
45     calc = QtGui.QWidget()
46     ui = Ui_calc()
47     ui.setupUi(calc)
48     calc.show()
49     sys.exit(app.exec_())

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

 1 # -*- coding: utf-8 -*-
 2 from  PyQt4 import  QtGui, QtCore
 3 from  calc import  Ui_calc  # 引入Ui
 4
 5
 6
 7 class calc_logic(QtGui.QWidget):
 8     def __init__(self,parent=None):
 9         super(calc_logic,self).__init__(parent)
10         self.Ui=Ui_calc()  # 实例化 Ui
11         self.Ui.setupUi(self) # 初始化Ui
12         self.setWindowTitle(‘calc_logic Widget‘)
13
14         self.connect(self.Ui.pushButton_ok,QtCore.SIGNAL(‘clicked()‘),self.dialogx)
15
16     def dialogx(self):
17         if __name__==‘__main__‘:
18             QtGui.QMessageBox.information(self, (u‘提示‘),(u‘  来自calc_logic文件请求!     ‘),QtGui.QMessageBox.Yes )
19         elif __name__==‘calc_logic‘:
20             QtGui.QMessageBox.information(self, (u‘提示‘),(u‘  来自main文件请求!     ‘),QtGui.QMessageBox.Yes )
21
22
23 if __name__ == "__main__":
24     import sys
25     app = QtGui.QApplication(sys.argv)
26     calc =calc_logic()
27     calc.show()
28     sys.exit(app.exec_())

新建入口文件main.py

 1 # -*- coding: utf-8 -*-
 2 ‘‘‘
 3  main 主文件
 4 ‘‘‘
 5 from  PyQt4 import  QtGui
 6 import sys
 7 from calc_logic import calc_logic   # 引入Ui的逻辑文件
 8
 9
10 class maincalc(QtGui.QWidget):
11     def __init__(self):
12         super(maincalc,self).__init__()
13         self.setWindowTitle(‘main Widget‘)
14         self.Ui=calc_logic(self) # 实例化 calc_logic
15
16
17
18
19 if __name__ == "__main__":
20     import sys
21     app = QtGui.QApplication(sys.argv)
22     appcalc =maincalc()
23     appcalc.show()
24     sys.exit(app.exec_())

我们先运行calc_logic.py :

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

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

改为:

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

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

1 self.Ui=calc_logic()

运行效果:

将mian.py 改回带self参数:

1 self.Ui=calc_logic(self)

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

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

在运行main.py :

时间: 2024-10-21 22:50:02

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

PHP中::、-&gt;、self、parent::、$this操作符的区别

在访问PHP类中的成员变量或方法时,如果被引用的变量或者方法被声明成const(定义常量)或者static(声明静态),那么就必须使用操作符::,反之如果被引用的变量或者方法没有被声明成const或者static,那么就必须使用操作符->. 另外,如果从类的内部访问const或者static变量或者方法,那么就必须使用自引用的self,反之如果从类的内部访问不为const或者static变量或者方法,那么就必须使用自引用的$this. 静态变量是只存在于函数作用域的变量, 不过, 在函数执行完成

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

原文:https://zhuanlan.zhihu.com/p/31310536 /********原文********/ 最近很多学习Qt的小伙伴在我的微信公众号私信我,该如何理解下面段代码的第二行QWidget(parent) 1 Widget::Widget(QWidget *parent) : 2 QWidget(parent) 3 { 4 5 } 为了统一回复大家,小豆君特意写了这篇文章,方便初学者们学习. 在讲解原因之前,先请大家看下面的一个例子 1 #include <iostre

PyQt中如何隐藏Menu

PyQt中隐藏一个Menu Item,可以通过QAction的setVisible(False)来设置,而QMenu的setVisible(False)是不管用的. 现在问题来了,我们有一个菜单,它有一些子菜单,如何隐藏它呢? fileMenu = self.menuBar().addMenu('File')self.newMenu = fileMenu.addMenu('New')self.newMenu.addAction('New Work')self.newMenu.addAction(

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

一.项目背景: 看了matplotlib for python developers这本书,基本掌握了在pyqt中显示曲线的做法,于是自己写一个. 二.需求描述: 1)X轴显示时间点,显示长度为1分钟,每一秒钟绘制一个点,X轴长度超过1分钟,则左移1秒刻度,实现动态效果 2)Y轴显示随机变化的数值,1-100 三.准备工作 1环境:python3.3,eric5,pyqt4 四.开始动手 : 使用Eric创建新项目: 在设计编码前期主要用到Eric的两个窗口:源码和窗体浏览器,类似delphi.

pyqt中使用matplotlib绘制动态曲线

一.项目背景: 看了matplotlib for python developers这本书,基本掌握了在pyqt中显示曲线的做法,于是自己写一个. 二.需求描述: 1)X轴显示时间点,显示长度为1分钟,每一秒钟绘制一个点,X轴长度超过1分钟,则左移1秒刻度,实现动态效果 2)Y轴显示随机变化的数值,1-100 三.准备工作 1环境:python3.3,eric5,pyqt4 四.开始动手: 使用Eric创建新项目: 在设计编码前期主要用到Eric的两个窗口:源码和窗体浏览器,类似delphi.

Python中__init__方法

注意1.__init__并不相当于C#中的构造函数,执行它的时候,实例已构造出来了. 1 2 3 4 5 class A(object):     def __init__(self,name):         self.name=name     def getName(self):         return 'A '+self.name 当我们执行 1 a=A('hello') 时,可以理解为 1 2 a=object.__new__(A) A.__init__(a,'hello')

Python 中 if __name__ == &#39;__main__&#39; 的正确理解

程序入口 对于很多编程语言来说,程序都必须要有一个入口,比如 C,C++,以及完全面向对象的编程语言 Java,C# 等.如果你接触过这些语言,对于程序入口这个概念应该很好理解,C 和 C++ 都需要有一个 main 函数来作为程序的入口,也就是程序的运行会从 main 函数开始.同样,Java 和 C# 必须要有一个包含 Main 方法的主类来作为程序入口. 而 Python 则有不同,它属于脚本语言,不像编译型语言那样先将程序编译成二进制再运行,而是动态的逐行解释运行.也就是从脚本第一行开始

ios中关于对锚点的理解

锚点在ios中见到的地方不多,大部分用在动画中. 今天看到一个动画,上面都是关于锚点的,锚点这个概念在两年前看cocos2d得基本概念时接触过,当时没怎么看,今天看到了,就在好好的学一下. 看了一篇blog,是关于锚点的,就借鉴一些上面的图像: cocos2d里采用OpenGL ES坐标系,坐标原点在屏幕左下角.而ios采用的是Quartz 2D坐标系,坐标原点在屏幕左上角. 在cocos2d和ios中分别把视图的坐标点设为(10,10),结果如下: 那么什么是锚点呢?下面以一个例子来说明: 比

数据库中一些基本概念的深入理解

1.怎样理解事务的一致性 一致性就是一个这样的东西,一致性对于不同的应用领域有着不同的定义,因为它就是按照业务规则来说明这个是一致的,那个是不一致的,这个角度上讲,一致性就是一个系统的状态,一个合理的状态.而合理则表现在这个状态是否符合业务规则.例如:转账业务中合理的状态就是,转出和转入帐户必须出入相等,如果不等那就意味着不合理,也就是不一致,有时候我们很容易就能把它定为"守恒一致性",也就是说总体来说什么也不多,什么也不少就是一致性.而这个规则能够使用于其他的义务吗?我们不能说不能,