1.3.1 使用move()方法布局

最简单的布局方式就是使用move()方法来规定各个控件在窗口中的位置。在使用这个方法前,我们先来简单了解一下PyQt的坐标体系,如图1-10所示。

图1-10 PyQt的坐标体系

不管是窗口还是控件,它们的坐标原点(以及锚点)都在左上角,而且向右为x轴正方向,向下为y轴正方向。也就是说,如果我们要调用move()方法把一个QLabel控件放在坐标为(50, 100)的窗口位置上,其实就是规定QLabel控件左上角在窗口上的位置,如图1-11所示。

图1-11 QLabel控件在(50, 100)坐标处

我们现在可以实际操作一下,示例代码1-6通过move()方法把QLabel放在了窗口上的其他位置。

示例代码1-6

import sys
from PyQt5.QtWidgets import *
 
class Window(QWidget):
    def __init__(self):
        super(Window, self).__init__()
        self.resize(200, 200)       # 1
 
        label_1 = QLabel('Label 1', self)
        label_2 = QLabel('Label 2', self)
        label_1.move(-20, 0)        #注释2开始
        label_2.move(50, 100)       #注释2结束
 
if __name__ == '__main__':
    app = QApplication([])
    window = Window()
    window.show()
    sys.exit(app.exec())

运行结果如图1-12所示。

图1-12 QLabel控件的位置

代码解释:

#1 调用resize()方法将窗口大小设置为宽200像素,长200像素。

#2 调用move()方法分别设置两个QLabel控件的位置。这里将label_1控件对象设置在了坐标为(−20, 0)的位置上。之前说过,窗口的左上角为坐标原点(0, 0),QLabel控件的坐标为(−20, 0)也就意味着控件还往原点左侧移动了一些,这样的话一部分文本就会被遮住。

使用move()方法可以快速进行布局,但是当控件数量很多时,该方法就不再方便了。因为我们要计算很多个坐标,而且万一其中一个控件的位置要改变,就可能会影响其他所有控件的位置,牵一发而动全身的方法是不推荐的。另外,使用move()方法还有一个弊端——坐标都是固定的。也就是说,当我们拉伸窗口时,控件的位置固定不变,并不能够自适应。为了解决这些问题,我们就需要用到PyQt中的布局管理器。