1. 绝对定位
from PyQt5.QtWidgets import QLabel
lbl1 = QLabel('Zetcode', self)
lbl1.move(15, 10)
lbl2 = QLabel('tutorials', self)
lbl2.move(35, 40)
lbl3 = QLabel('for programmers', self)
lbl3.move(55, 70)
绝对定位存在的问题:
1.控件大小和位置不随窗口的大小改变
2.不同平台看起来也许会有不同
3.改变字体也许会影响布局
4.如果决定改变布局,就必需重新布局。
2. 框布局(QBoxLayout)
方法 | 描述 |
---|---|
addLayout(self, QLayout, stretch = 0) | 在窗口的右边或下边添加布局 |
addWidget(self, QWidget, stretch, Qt.Alignment) | 在布局中添加控件,伸缩量stretch只适用于QBoxLayout, alignment指定对齐方式 |
setSpacing(self, int) | 设置各控件的上下或左右间距 |
程序示例:
import sys
from PyQt5.QtWidgets import (QWidget, QPushButton,
QHBoxLayout, QVBoxLayout, QApplication)
from PyQt5.QtCore import Qt
class Example(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
okButton = QPushButton("OK")
cancelButton = QPushButton("Cancel")
hbox = QHBoxLayout() # 水平(Horizontal)布局
hbox.addStretch(1)
hbox.addWidget(okButton, 0, Qt.AlignLeft|Qt.AlignTop)
hbox.addWidget(cancelButton)
hbox.addWidget(QPushButton('Quit'), 0, Qt.AlignLeft|Qt.AlignBottom)
hbox.setSpacing(10)
vbox = QVBoxLayout() # 垂直(Vertical)布局
vbox.addStretch(2) # 如果要查看对齐方式的效果,把这两行注释掉
vbox.addLayout(hbox)# 垂直布局下嵌套水平布局
vbox.addStretch(1) # 如果要查看对齐方式的效果,把这两行注释掉
self.setLayout(vbox)
self.setGeometry(300, 300, 300, 150)
self.setWindowTitle('Buttons')
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
释疑addStretch():将按钮之外的所有空间分为对应比例的可伸缩控件,所以无论你要分为几份(哪怕是0份),按钮都会挤在一起(其余所有空间都分为可伸缩控件)
vbox = QVBoxLayout(self)
vbox.addStretch(1)
vbox.addWidget(btn1)
vbox.addStretch(1)
vbox.addWidget(btn2)
vbox.addStretch(2)
vbox.addWidget(btn3)
对于上述程序,呈现的结果应如下图所示:
3. 网格布局(QGridLayout)
方法 | 描述 |
---|---|
addWidget(QWidget, row, col, alignment) | 添加到固定的位置,row和col均从0开始 |
addWidget(QWidget, row, col, rowSpan, colSpan, alignment) | 适用于所添加的控件跨越多行或列时,row和col为起始行/列,rowSpan和colSpan为跨越行列数 |
单一的网格单元格
import sys
from PyQt5.QtWidgets import (