zoukankan      html  css  js  c++  java
  • 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 :

  • 相关阅读:
    Android——继续深造——从安装Android Studio 2.0开始(详)
    PHP——安装wampserver丢失MSVCR110.dll
    Marza Gift for GDC 2016
    Retrieve OpenGL Context from Qt 5.5 on OSX
    Space Time Varying Color Palette
    Screen Space Depth Varying Glow based on Heat Diffusion
    Visualization of Detail Point Set by Local Algebraic Sphere Fitting
    Glass Dragon
    Jump Flood Algorithms for Centroidal Voronoi Tessellation
    京都之行
  • 原文地址:https://www.cnblogs.com/dcb3688/p/4255467.html
Copyright © 2011-2022 走看看