首页 > 代码库 > Pyqt 中__init__(self,parent==None) parent理解

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, QtGui11 12 try:13     _fromUtf8 = QtCore.QString.fromUtf814 except AttributeError:15     def _fromUtf8(s):16         return s17 18 try:19     _encoding = QtGui.QApplication.UnicodeUTF820     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 sys44     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()  # 实例化 Ui11         self.Ui.setupUi(self) # 初始化Ui12         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 sys25     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_logic15 16 17 18 19 if __name__ == "__main__":20     import sys21     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 :

技术分享

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