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編程中是自然而然的事情了。
實例講解
示例說明:
新建三個文件,分別爲 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文件:
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 文件,文件內容:
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:
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_())
(1)情形1
我們先運行calc_logic.py ,得到結果:
關鍵語句在於:
mian.py中的
self.Ui=calc_logic(self)
clac_logic.py中的:
def __init__(self,parent=None):
super(calc_logic,self).__init__(parent)
(2)情形2
然後修改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(self) # 實例化 calc_logic
改爲:
self.Ui=calc_logic()
得到結果爲:
(3)總結