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 :

  • 相关阅读:
    一个简单实现的string类
    Python基础(二)
    Python基础(一)
    区块链初探
    某电商平台开发记要——客服系统
    某电商平台开发记要
    Upload files to aliyunOSS with bootstrap-fileinput
    jquery.validate[.unobtrusive]和Bootstrap实现tooltip错误提示
    PostgreSQL笔记
    天冷了,那些树还好吗?
  • 原文地址:https://www.cnblogs.com/dcb3688/p/4255467.html
Copyright © 2011-2022 走看看