Python與Qt UI的圖形介面程式設計(三)
Qt提供了很多關於獲取窗體位置及顯示區域大小的函式,本例項利用一個簡單的對話方塊顯示窗體的各種位置資訊,包括窗體的所在點位置,長,寬資訊等。本例項的目的是分析各個有關位置資訊的函式之間的區別,如x(),y(),pos(),rect(),size(),geometry()等,以及在不同的情況下應使用哪個函式來獲取位置資訊。實現的效果如下圖:
在例項中,分別呼叫了x(),y(),frameGeometry(),pos(),geometry(),width(),height(),rect(),size()幾個函式,這幾個函式均是QWidget提供的。當改變對話方塊的大小,或移動對話方塊時,呼叫各個函式所獲得的資訊顯示也相應地發生變化,從變化中可得知各函式之間的區別。
由於本例項的目的是為了分析各函式之間的區別並獲得結論,而程式本身的實現較為簡單,因些只簡單介紹實現過程。實現程式碼如下:
- from PyQt4.QtCore import *
- from PyQt4.QtGui import *
- import sys
- class Geometry(QDialog):
- def __init__(self,parent=None):
- super(Geometry,self).__init__(parent)
- self.setWindowTitle("Geometry")
- Label1=QLabel("x0:"
- Label2=QLabel("y0:")
- Label3=QLabel("frameGeometry():")
- Label4=QLabel("pos():")
- Label5=QLabel("geometry():")
- Label6=QLabel("width():")
- Label7=QLabel("height():")
- Label8=QLabel("rect():")
- Label9=QLabel("size():")
- self.xLabel=QLabel()
- self.yLabel=QLabel()
- self.frameGeoLabel=QLabel()
- self.posLabel=QLabel()
- self.geoLabel=QLabel()
- self.widthLabel=QLabel()
- self.heightLabel=QLabel()
- self.rectLabel=QLabel()
- self.sizeLabel=QLabel()
- layout=QGridLayout()
- layout.addWidget(Label1,0,0)
- layout.addWidget(self.xLabel,0,1)
- layout.addWidget(Label2,1,0)
- layout.addWidget(self.yLabel,1,1)
- layout.addWidget(Label3,2,0)
- layout.addWidget(self.frameGeoLabel,2,1)
- layout.addWidget(Label4,3,0)
- layout.addWidget(self.posLabel,3,1)
- layout.addWidget(Label5,4,0)
- layout.addWidget(self.geoLabel,4,1)
- layout.addWidget(Label6,5,0)
- layout.addWidget(self.widthLabel,5,1)
- layout.addWidget(Label7,6,0)
- layout.addWidget(self.heightLabel,6,1)
- layout.addWidget(Label8,7,0)
- layout.addWidget(self.rectLabel,7,1)
- layout.addWidget(Label9,8,0)
- layout.addWidget(self.sizeLabel,8,1)
- self.setLayout(layout)
- self.updateLabel()
- def moveEvent(self,event):
- self.updateLabel()
- def resizeEvent(self,event):
- self.updateLabel()
- def updateLabel(self):
- temp=QString()
- self.xLabel.setText(temp.setNum(self.x()))
- self.yLabel.setText(temp.setNum(self.y()))
- self.frameGeoLabel.setText(temp.setNum(self.frameGeometry().x())+","+
- temp.setNum(self.frameGeometry().y())+","+
- temp.setNum(self.frameGeometry().width())+","+
- temp.setNum(self.frameGeometry().height()))
- self.posLabel.setText(temp.setNum(self.pos().x())+","+
- temp.setNum(self.pos().y()))
- self.geoLabel.setText(temp.setNum(self.geometry().x())+","+
- temp.setNum(self.geometry().y())+","+
- temp.setNum(self.geometry().width())+","+
- temp.setNum(self.geometry().height()))
- self.widthLabel.setText(temp.setNum(self.width()))
- self.heightLabel.setText(temp.setNum(self.height()))
- self.rectLabel.setText(temp.setNum(self.rect().x())+","+
- temp.setNum(self.rect().y())+","+
- temp.setNum(self.rect().width())+","+
- temp.setNum(self.rect().height()))
- self.sizeLabel.setText(temp.setNum(self.size().width())+","+
- temp.setNum(self.size().height()))
- app=QApplication(sys.argv)
- form=Geometry()
- form.show()
- app.exec_()
程式初始化時呼叫updateLabel()函式,以獲得各位置函式的資訊並顯示。
updateLabel()函式負責呼叫各個位置函式獲得結果並顯示。
重定義QWidget的moveEvent()和resizeEvent()函式,分別響應對話方塊的移動事件和調整大小事件,使得窗體在被移動或窗體大小發生改變時,能同步更新各函式結果的顯示。
通過這個例子可以獲得如下圖所示的結論。
x(),y()和pos()函式都是獲得整個窗體左上角的座標位置。而frameGeometry()與geometry()相對應,frameGeometry()是獲得整個窗體的左上頂點和長,寬值,而geometry()函式獲得的是窗體內中央區域的左上頂點座標以及長,寬值。直接呼叫width()和height()函式獲得的是中央區域的長和寬的值。
還有兩個函式rect()和size(),呼叫它們獲得的結果也都是對於窗體的中央區域而言的,size()獲得的是窗體中央區域的長,寬值,rect()與geometry()一樣返回一個QRect物件。其中,兩個函式獲得的長,寬值是一樣的,都是窗體中央區域的長,寬值,只是左上頂點座標值不一樣,geometry()獲得的左上頂點座標是相對於父窗體而言的座標,而rect()獲得的左上頂點座標始終為(0,0)。
因此,在實際應用中需根據情況使用正確的位置資訊函式以獲得準確的位置尺寸資訊,尤其是在編寫對位置精度要求較高的程式時,如地圖瀏覽程式,更應注意函式的選擇,避免產生不必要的誤差。
在編寫程式時,初始化窗體時最好不要使用setGeometry()函式,而用resize()和move()函式代替,因為使用setGeometry()會導致窗體show()之後在錯誤的位置上停留很短暫的一段時間,帶來閃爍現象。