嵌套布局
在布局中添加其他布局
import sys
from PyQt5.QtWidgets import QApplication,QWidget,QHBoxLayout,QVBoxLayout,QGridLayout,QFormLayout,QPushButton
class MyWindow(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("嵌套布局示例")
# 全局布局 水平
wlayout = QHBoxLayout()
#局部布局
hlayout = QHBoxLayout()
vlayout = QVBoxLayout()
glayout = QGridLayout()
formlayout = QFormLayout()
# 为局部布局添加控件
hlayout.addWidget(QPushButton(str(1)))
hlayout.addWidget(QPushButton(str(2)))
vlayout.addWidget(QPushButton(str(3)))
vlayout.addWidget(QPushButton(str(4)))
glayout.addWidget(QPushButton(str(5)),0,0)
glayout.addWidget(QPushButton(str(6)),0,1)
glayout.addWidget(QPushButton(str(7)),1,0)
glayout.addWidget(QPushButton(str(8)),1,1)
formlayout.addWidget(QPushButton(str(9)))
formlayout.addWidget(QPushButton(str(10)))
formlayout.addWidget(QPushButton(str(11)))
formlayout.addWidget(QPushButton(str(12)))
# 四个控件
hwg = QWidget()
vwg = QWidget()
gwg = QWidget()
fwg = QWidget()
# 使用四个控件进行设备局部布局
hwg.setLayout(hlayout)
vwg.setLayout(vlayout)
gwg.setLayout(glayout)
fwg.setLayout(formlayout)
# 添加到全局布局
wlayout.addWidget(hwg)
wlayout.addWidget(vwg)
wlayout.addWidget(gwg)
wlayout.addWidget(fwg)
# 将窗口本身设置为全局布局
self.setLayout(wlayout)
if __name__ == '__main__':
app = QApplication(sys.argv)
win = MyWindow()
win.show()
sys.exit(app.exec_())
在控件中添加布局
from PyQt5.QtWidgets import *
import sys
class MyWindow(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("嵌套布局示例")
self.resize(700,200)
# 全局控件 self 用于承载全局布局
wwg = QWidget(self)
# 全局布局
wl = QHBoxLayout(wwg)
hlayout = QHBoxLayout()
vlayout = QVBoxLayout()
glayout = QGridLayout()
formlayout = QFormLayout()
# 为局部布局添加控件
hlayout.addWidget(QPushButton(str(1)))
hlayout.addWidget(QPushButton(str(2)))
vlayout.addWidget(QPushButton(str(3)))
vlayout.addWidget(QPushButton(str(4)))
glayout.addWidget(QPushButton(str(5)), 0, 0)
glayout.addWidget(QPushButton(str(6)), 0, 1)
glayout.addWidget(QPushButton(str(7)), 1, 0)
glayout.addWidget(QPushButton(str(8)), 1, 1)
formlayout.addWidget(QPushButton(str(9)))
formlayout.addWidget(QPushButton(str(10)))
formlayout.addWidget(QPushButton(str(11)))
formlayout.addWidget(QPushButton(str(12)))
# 局部布局中添加控件,然后将其添加到全局布局中
wl.addLayout(hlayout)
wl.addLayout(vlayout)
wl.addLayout(glayout)
wl.addLayout(formlayout)
if __name__ == '__main__':
app = QApplication(sys.argv)
win = MyWindow()
win.show()
sys.exit(app.exec_())
QSplitter
PyQt提供了一个特殊的布局管理器QSplitter,可以动态地拖动子控件之间的边界,算是一个动态布局管理器。QSplitter允许用户通过拖动子控件的边界来控制子控件的大小,并提供了一个处理拖曳子控件的控制器。
方法 | 描述 |
---|---|
addWidget() | 将小控件添加到QSplitter管理器的布局中 |
indexOf() | 返回小控件的QSplitter管理器中的索引 |
insertWidget() | 根据指定的索引将一个控件插入到QSplitter管理器中 |
setOrientation() | 设置布局方向 · Qt.Horizontal 水平方向 · Qt.Vertical 垂直方向 |
setSizes() | 设置控件的初始化大小 |
count() | 返回小控件在QSplitter管理器中的数量 |
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class SplitterExample(QWidget):
def __init__(self):
super(SplitterExample,self).__init__()
self.initUI()
def initUI(self):
hbox = QHBoxLayout(self)
self.setWindowTitle("QSplitter 例子")
self.setGeometry(300,300,300,200)
topleft = QFrame()
topleft.setFrameShape(QFrame.StyledPanel)
bottom = QFrame()
bottom.setFrameShape(QFrame.StyledPanel)
splitter1 = QSplitter(Qt.Horizontal)
textedit = QTextEdit()
splitter1.addWidget(topleft)
splitter1.addWidget(textedit)
splitter1.setSizes([100,200])
splitter2 = QSplitter(Qt.Vertical)
splitter2.addWidget(splitter1)
splitter2.addWidget(bottom)
hbox.addWidget(splitter2)
self.setLayout(hbox)
if __name__ == '__main__':
app = QApplication(sys.argv)
demo = SplitterExample()
demo.show()
sys.exit(app.exec_())