【转】PyQt4 精彩实例分析 实例 3 各类位置信息

Qt 提供了很多关于获取窗体位置及显示区域大小的函数,本实例利用一个简单的对话框显示窗体的各种位置
信息,包括窗体的所在点位置,长,宽信息等。本实例的目的是分析各个有关位置信息的函数之间的区别,如
x(),y(),pos(),rect(),size(),geometry()等,以及在不同的情况下应使用哪个函数来获取位置信
息。实现的效果如下图:

在实例中,分别调用了 x(),y(),frameGeometry(),pos(),geometry(),width(),height(),rect(),
size()几个函数,这几个函数均是 QWidget 提供的。当改变对话框的大小,或移动对话框时,调用各个函
数所获得的信息显示也相应地发生变化,从变化中可得知各函数之间的区别。

由于本实例的目的是为了分析各函数之间的区别并获得结论,而程序本身的实现较为简单,因些只简单介绍实
现过程。实现代码如下:

  1 #!/usr/bin/python
  2 # -*- coding: utf-8 -*-
  3 
  4 from PyQt4.QtGui import *
  5 from PyQt4.QtCore import *
  6 import sys
  7 
  8 
  9 QTextCodec.setCodecForTr(QTextCodec.codecForName("utf8"))
 10 
 11 class Geometry(QDialog):
 12 
 13     def __init__(self, parent=None):
 14         super(Geometry, self).__init__(parent)
 15 
 16         self.setWindowTitle("Geometry")
 17 
 18         self.label_0 = QLabel("x0: ")
 19         self.label_1 = QLabel("y0: ")
 20         self.label_2 = QLabel("frameGeometry(): ")
 21         self.label_3 = QLabel("pos(): ")
 22         self.label_4 = QLabel("geometry(): ")
 23         self.label_5 = QLabel("width(): ")
 24         self.label_6 = QLabel("height(): ")
 25         self.label_7 = QLabel("rect(): ")
 26         self.label_8 = QLabel("size(): ")
 27 
 28         self.xLabel = QLabel()
 29         self.yLabel = QLabel()
 30         self.frameGeoLabel = QLabel()
 31         self.posLabel = QLabel()
 32         self.geoLabel = QLabel()
 33         self.widthLabel = QLabel()
 34         self.heightLabel = QLabel()
 35         self.rectLabel = QLabel()
 36         self.sizeLabel = QLabel()
 37 
 38         self.Layout()
 39 
 40     def Layout(self):
 41         layout=QGridLayout()
 42         layout.addWidget(self.label_0, 0, 0)
 43         layout.addWidget(self.xLabel, 0, 1)
 44         layout.addWidget(self.label_1, 1, 0)
 45         layout.addWidget(self.yLabel, 1, 1)
 46         layout.addWidget(self.label_2, 2, 0)
 47         layout.addWidget(self.frameGeoLabel, 2, 1)
 48         layout.addWidget(self.label_3, 3, 0)
 49         layout.addWidget(self.posLabel, 3, 1)
 50         layout.addWidget(self.label_4, 4, 0)
 51         layout.addWidget(self.geoLabel, 4, 1)
 52         layout.addWidget(self.label_5, 5, 0)
 53         layout.addWidget(self.widthLabel, 5, 1)
 54         layout.addWidget(self.label_6, 6, 0)
 55         layout.addWidget(self.heightLabel, 6, 1)
 56         layout.addWidget(self.label_7, 7, 0)
 57         layout.addWidget(self.rectLabel, 7, 1)
 58         layout.addWidget(self.label_8, 8, 0)
 59         layout.addWidget(self.sizeLabel, 8, 1)
 60 
 61         self.setLayout(layout)
 62         self.updateLabel()
 63 
 64     def moveEvent(self,event):
 65         self.updateLabel()
 66 
 67     def resizeEvent(self,event):
 68         self.updateLabel()
 69 
 70     def updateLabel(self):
 71         temp=QString()
 72         self.xLabel.setText(temp.setNum(self.x()))
 73         self.yLabel.setText(temp.setNum(self.y()))
 74         self.frameGeoLabel.setText(temp.setNum(self.frameGeometry().x()) + "," + 
 75                                         temp.setNum(self.frameGeometry().y()) + "," + 
 76                                         temp.setNum(self.frameGeometry().width()) + "," + 
 77                                         temp.setNum(self.frameGeometry().height()))
 78         self.posLabel.setText(temp.setNum(self.pos().x()) + "," + 
 79                                         temp.setNum(self.pos().y()))
 80         self.geoLabel.setText(temp.setNum(self.geometry().x()) + "," + 
 81                                         temp.setNum(self.geometry().y()) + "," + 
 82                                         temp.setNum(self.geometry().width()) + "," + 
 83                                         temp.setNum(self.geometry().height()))
 84         self.widthLabel.setText(temp.setNum(self.width()))
 85         self.heightLabel.setText(temp.setNum(self.height()))
 86         self.rectLabel.setText(temp.setNum(self.rect().x()) + "," + 
 87                                         temp.setNum(self.rect().y()) + "," + 
 88                                         temp.setNum(self.rect().width()) + "," + 
 89                                         temp.setNum(self.rect().height()))
 90         self.sizeLabel.setText(temp.setNum(self.size().width()) + "," + 
 91                                         temp.setNum(self.size().height()))
 92 
 93 def main():
 94     app = QApplication(sys.argv)
 95     form = Geometry()
 96     form.show()
 97     app.exec_()
 98 
 99 if __name__ == '__main__':
100     main()

程序初始化时调用 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()之后在错误的位置上停留很短暂的一段时间,带来闪烁现象。

posted @ 2014-11-14 11:23  jakey.chen  阅读(534)  评论(0)    收藏  举报