注:原創(chuàng)不易,,轉(zhuǎn)載請(qǐng)務(wù)必注明原作者和出處,,感謝支持,!
一 寫在開頭
1.1 本文內(nèi)容
本文內(nèi)容為PyQt5中的布局管理,。具體內(nèi)容為:
- 絕對(duì)布局
- 布局類
- 水平布局(QHBoxLayout)
- 垂直布局(QVBoxLayout)
- 網(wǎng)格布局(QGridLayout)
- 表單布局(QFormLayout)
- 嵌套布局
- 布局管理器QSplitter
二 絕對(duì)布局
絕對(duì)布局主要用到兩個(gè)方法,,分別是move()和setGeometry(),。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import QWidget, QLabel, QApplication
class Window(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
lb1 = QLabel('歡迎', self)
lb1.move(15, 10)
lb2 = QLabel('學(xué)習(xí)', self)
lb2.move(35, 40)
lb3 = QLabel('PyQt 5', self)
lb3.move(55, 70)
self.setGeometry(300, 300, 250, 150)
self.setWindowTitle('PyQt 5中的絕對(duì)定位')
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
w = Window()
sys.exit(app.exec_())
絕對(duì)布局的優(yōu)點(diǎn):
絕對(duì)布局的缺點(diǎn):
- 如果改變一個(gè)窗口的大小,,窗口中控件的大小和位置不會(huì)隨之改變
- 所生成的窗口在不同的操作系統(tǒng)下看起來(lái)可能不一樣
- 在程序中改變字體時(shí)可能會(huì)破壞布局
- 如果修改布局,,比如新增一個(gè)控件,就必須全部重新布局,,既煩瑣又費(fèi)時(shí)
三 布局類
3.1 水平布局(QHBoxLayout)和垂直布局(QVBoxLayout)
本小節(jié)涉及到的方法及其描述如下:
方法 |
描述 |
addLayout(self, QLayout, stretch = 0) |
在窗口中添加布局,,stretch為伸縮量,默認(rèn)為0 |
addWidget(self, QWidget, stretch, Qt.Alignment alignment) |
在布局中添加控件,,stretch為伸縮量,,alignment為對(duì)齊方式 |
addSpacing(self, int) |
添加伸縮量,具體使用方法見下面的例子 |
對(duì)齊方式Qt.Alignment可能取值有:
參數(shù) |
描述 |
Qt.AlignLeft |
水平居左對(duì)齊 |
Qt.AlignRight |
水平居右對(duì)齊 |
Qt.AlignCenter |
水平居中對(duì)齊 |
Qt.AlignJustify |
水平兩端對(duì)齊 |
Qt.AlignTop |
垂直靠上對(duì)齊 |
Qt.AlignBottom |
垂直靠下對(duì)齊 |
Qt.AlignVCenter |
垂直居中對(duì)齊 |
3.2 水平布局和垂直布局實(shí)例
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import QWidget, QPushButton, QHBoxLayout, QApplication
class Window(QWidget):
def __init__(self):
super().__init__()
hbox = QHBoxLayout()
hbox.addWidget(QPushButton(str(1)))
hbox.addWidget(QPushButton(str(2)))
hbox.addWidget(QPushButton(str(3)))
hbox.addWidget(QPushButton(str(4)))
hbox.addWidget(QPushButton(str(5)))
self.setLayout(hbox)
self.setWindowTitle('QHBoxLayout')
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
w = Window()
sys.exit(app.exec_())
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QWidget, QPushButton, QHBoxLayout, QApplication
class Window(QWidget):
def __init__(self):
super().__init__()
hbox = QHBoxLayout()
hbox.addWidget(QPushButton(str(1)), 0, Qt.AlignTop)
hbox.addWidget(QPushButton(str(2)), 0, Qt.AlignTop | Qt.AlignLeft)
hbox.addWidget(QPushButton(str(3)), 0)
hbox.addWidget(QPushButton(str(4)), 0, Qt.AlignLeft | Qt.AlignBottom)
hbox.addWidget(QPushButton(str(5)), 0, Qt.AlignTop)
self.setLayout(hbox)
self.setWindowTitle('水平布局')
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
w = Window()
sys.exit(app.exec_())
關(guān)于addSpacing()的用法見下面的實(shí)例,。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import QWidget, QPushButton, QHBoxLayout, QApplication
class Window(QWidget):
def __init__(self):
super().__init__()
btn1 = QPushButton()
btn2 = QPushButton()
btn3 = QPushButton()
btn1.setText(str(1))
btn2.setText(str(2))
btn3.setText(str(3))
# addSpacing(1)表示設(shè)置伸縮量為1
hbox = QHBoxLayout()
hbox.addStretch(1)
hbox.addWidget(btn1)
hbox.addStretch(1)
hbox.addWidget(btn2)
hbox.addStretch(1)
hbox.addWidget(btn3)
hbox.addStretch(1)
self.setLayout(hbox)
self.setWindowTitle('addStretch')
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
w = Window()
sys.exit(app.exec_())
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import QWidget, QPushButton, QHBoxLayout, QApplication
class Window(QWidget):
def __init__(self):
super().__init__()
btn1 = QPushButton()
btn2 = QPushButton()
btn3 = QPushButton()
btn1.setText(str(1))
btn2.setText(str(2))
btn3.setText(str(3))
hbox = QHBoxLayout()
hbox.addStretch(0)
hbox.addWidget(btn1)
hbox.addWidget(btn2)
hbox.addWidget(btn3)
hbox.addStretch(0)
self.setLayout(hbox)
self.setWindowTitle('addStretch')
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
w = Window()
sys.exit(app.exec_())
3.3 網(wǎng)格布局(QGridLayout)
網(wǎng)格布局需要用到的方法及其描述如下,。
方法 |
描述 |
addWidget(QWidget widget, int row, int col, int alignment = 0) |
給網(wǎng)格布局添加控件。 widget:要添加的控件 row:位置所在行 col:位置所在列 alignment:對(duì)齊方式 |
addWidget(QWidget widget, int fromRow, int fromColumn, int rowSpan, int columnSpan, int alignment) |
當(dāng)所添加的控件跨越多行或多列時(shí),,使用這個(gè)函數(shù) fromRow:起始行 fromColumn:起始列 rowSpan:控件跨越的行 columnSpan:控件跨越的列 |
setSpacing(int spacing) |
設(shè)置控件在水平和垂直方向的間隔 |
3.4 網(wǎng)格布局實(shí)例
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import QWidget, QGridLayout, QPushButton, QApplication
class Window(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
grid = QGridLayout()
self.setLayout(grid)
names = ['Cls', 'Back', '', 'Close',
'7', '8', '9', '/',
'4', '5', '6', '*',
'1', '2', '3', '-',
'0', '.', '=', '+']
positions = [(i, j) for i in range(5) for j in range(4)]
for position, name in zip(positions, names):
if name == '':
continue
btn = QPushButton(name)
grid.addWidget(btn, *position)
self.move(300, 150)
self.setWindowTitle('網(wǎng)格布局')
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
w = Window()
sys.exit(app.exec_())
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import QWidget, QLabel, QLineEdit, QTextEdit, QGridLayout, QApplication
class Window(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
title = QLabel('標(biāo)題')
author = QLabel('提交人')
review = QLabel('申告內(nèi)容')
titleEdit = QLineEdit()
authorEdit = QLineEdit()
reviewEdit = QTextEdit()
grid = QGridLayout()
grid.setSpacing(10)
self.setLayout(grid)
grid.addWidget(title, 0, 0)
grid.addWidget(titleEdit, 0, 1)
grid.addWidget(author, 1, 0)
grid.addWidget(authorEdit, 1, 1)
grid.addWidget(review, 2, 0)
grid.addWidget(reviewEdit, 2, 1, 2, 1)
self.setGeometry(300, 300, 350, 300)
self.setWindowTitle('故障申報(bào)')
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
w = Window()
sys.exit(app.exec_())
3.5 表單布局(QFormLayout)
QFormLayout是label-field式的表單布局,,顧名思義,就是實(shí)現(xiàn)表單方式的布局,。表單是提示用戶進(jìn)行交互的一種模式,,其主要由兩列組成,第一列用于顯示信息,,給用戶提示,,一般叫做label域;第二列需要用戶進(jìn)行選擇或者輸入,,一般叫做field域,。label與field的關(guān)系就是label關(guān)聯(lián)field。
QFormLayout需要用到addRow(label, field)方法,。
3.6 表單布局實(shí)例
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import QWidget, QFormLayout, QLabel, QLineEdit, QApplication
class Window(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
form = QFormLayout()
lb1 = QLabel('標(biāo)簽1')
le1 = QLineEdit()
lb2 = QLabel('標(biāo)簽2')
le2 = QLineEdit()
lb3 = QLabel('標(biāo)簽3')
le3 = QLineEdit()
form.addRow(lb1, le1)
form.addRow(lb2, le2)
form.addRow(lb3, le3)
self.resize(400, 100)
self.setLayout(form)
self.setWindowTitle('QFormLayout')
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
w = Window()
sys.exit(app.exec_())
3.7 嵌套布局
所謂嵌套布局就是綜合應(yīng)用上述的布局進(jìn)行嵌套以完成整體窗口的布局,。下面是有關(guān)嵌套布局的兩個(gè)等價(jià)實(shí)例,。注意第二個(gè)實(shí)例更加簡(jiǎn)單。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QHBoxLayout, QVBoxLayout, QGridLayout, QFormLayout, QPushButton
class Window(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('嵌套布局')
# 全局布局:水平
wlayout = QHBoxLayout()
# 局部布局:水平,,垂直,,網(wǎng)格,表單
hlayout = QHBoxLayout()
vlayout = QVBoxLayout()
glayout = QGridLayout()
flayout = 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)
flayout.addWidget(QPushButton(str(9)))
flayout.addWidget(QPushButton(str(10)))
flayout.addWidget(QPushButton(str(11)))
flayout.addWidget(QPushButton(str(12)))
# 準(zhǔn)備4個(gè)控件
hwg = QWidget()
vwg = QWidget()
gwg = QWidget()
fwg = QWidget()
# 使用4個(gè)控件設(shè)置局部布局
hwg.setLayout(hlayout)
vwg.setLayout(vlayout)
gwg.setLayout(glayout)
fwg.setLayout(flayout)
# 將4個(gè)控件添加到全局布局中
wlayout.addWidget(hwg)
wlayout.addWidget(vwg)
wlayout.addWidget(gwg)
wlayout.addWidget(fwg)
self.setLayout(wlayout)
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
w = Window()
sys.exit(app.exec_())
#!/usr/bin/env python3
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QHBoxLayout, QVBoxLayout, QGridLayout, QFormLayout, QPushButton
class Window(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('嵌套布局')
self.resize(700, 200)
# 全局控件(注意參數(shù)self),,用于承載全局布局
wwg = QWidget(self)
# 全局布局
wl = QHBoxLayout(wwg)
hlayout = QHBoxLayout()
vlayout = QVBoxLayout()
glayout = QGridLayout()
flayout = 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)
flayout.addWidget(QPushButton(str(9)))
flayout.addWidget(QPushButton(str(10)))
flayout.addWidget(QPushButton(str(11)))
flayout.addWidget(QPushButton(str(12)))
# 在布局布局wl中添加局部布局
wl.addLayout(hlayout)
wl.addLayout(vlayout)
wl.addLayout(glayout)
wl.addLayout(flayout)
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
w = Window()
sys.exit(app.exec_())
3.8 布局管理器QSplitter
PyQt提供了一個(gè)特殊的布局管理器QSplitter,,它可以動(dòng)態(tài)地拖動(dòng)子控件之間的邊界,算是一個(gè)動(dòng)態(tài)的布局管理器,。
與QSplitter相關(guān)的方法及其描述如下,。
方法 |
描述 |
addWidget() |
將控件添加到QSplitter管理器的布局中 |
indexOf() |
返回控件在QSplitter管理器中的索引 |
insertWidget() |
根據(jù)索引將一個(gè)控件插入到QSplitter管理器中 |
setOrientation() |
設(shè)置布局方法 Qt.Horizontal:水平方向 Qt.Vertical:垂直方向 |
setSizes() |
設(shè)置控件的初始化大小 |
count() |
返回小控件在QSplitter管理器中的數(shù)量 |
#!/usr/bin/env python3
import sys
from PyQt5.QtWidgets import QWidget, QHBoxLayout, QSplitter, QTextEdit, QApplication, QFrame
from PyQt5.QtCore import Qt
class Window(QWidget):
def __init__(self):
super().__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)
sp1 = QSplitter(Qt.Horizontal)
te = QTextEdit()
sp1.addWidget(topleft)
sp1.addWidget(te)
sp1.setSizes([100, 200])
sp2 = QSplitter(Qt.Vertical)
sp2.addWidget(sp1)
sp2.addWidget(bottom)
hbox.addWidget(sp2)
self.setLayout(hbox)
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
w = Window()
sys.exit(app.exec_())
|