Python版本3.7
PySide2 Version: 5.14.1
官方文檔:http://doc.qt.io/qtforpython/index.html
在界面上零远,如果手動來定位各個控件的話是非常不容易的,所以有了用于專門管理界面的控件研侣,稱為布局控件球碉。
所有布局控件都繼承自QLayout
,但是這里不討論QLayout
,只討論它的子類达布。
QVBoxLayout和QHBoxLayout
from PySide2.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout, QHBoxLayout
app = QApplication()
window = QWidget()
button1 = QPushButton("One")
button2 = QPushButton("Two")
button3 = QPushButton("Three")
button4 = QPushButton("Four")
button5 = QPushButton("Five")
# 創(chuàng)建一個垂直管理布局控件
layout = QVBoxLayout()
# layout = QHBoxLayout()
# 將button1添加到布局當中進行管理, 以下同理
layout.addWidget(button1)
layout.addWidget(button2)
layout.addWidget(button3)
layout.addWidget(button4)
layout.addWidget(button5)
window.setLayout(layout)
window.show()
app.exec_()
QVBoxLayout
和QHBoxLayout
分別是垂直布局控件和水平布局控件逾冬。有些人可能有疑問黍聂,這里的button實例為什么都沒有表明父類是誰,卻能正常顯示身腻。這是因為這些按鈕已經(jīng)被layout收起來集中管理了产还,然后window設置了布局控件為layout,所以只要layout能正常工作嘀趟,這些按鈕就會顯示出來脐区。
舉例說明
from PySide2 import QtWidgets, QtCore
class MyWidget(QtWidgets.QWidget):
def __init__(self, parent=None):
super().__init__(parent)
# 創(chuàng)建一個二位數(shù)的lcd對象
self.lcd = QtWidgets.QLCDNumber(2)
self.slider = QtWidgets.QSlider(QtCore.Qt.Horizontal)
# 設置slider大小范圍
self.slider.setRange(0, 99)
# 連接slider的valueChanged信號到lcd的display槽
self.slider.valueChanged.connect(self.lcd.display)
# 設置初始值為40,lcd會自動更新她按,因為已經(jīng)連接了信號和槽
self.slider.setValue(40)
# 創(chuàng)建一個垂直管理布局控件
self.layout = QtWidgets.QVBoxLayout()
self.layout.addWidget(self.lcd)
self.layout.addWidget(self.slider)
self.setLayout(self.layout)
app = QtWidgets.QApplication()
window = QtWidgets.QWidget()
# 創(chuàng)建一個水平管理布局控件
layout = QtWidgets.QHBoxLayout()
widget1 = MyWidget()
widget2 = MyWidget()
layout.addWidget(widget1)
layout.addWidget(widget2)
window.setLayout(layout)
window.show()
app.exec_()
運行截圖:
上面有一個新控件就是QLCDNumber
牛隅,用于顯示數(shù)字的,然后自己定義了一個MyWidget類酌泰,包含了一個數(shù)碼管和一個滑動條媒佣,并把它們放到了垂直布局里面。在window對象中創(chuàng)建了兩個自定義對象和設置了水平布局陵刹。
QGridLayout
from PySide2 import QtWidgets, QtCore
app = QtWidgets.QApplication()
window = QtWidgets.QWidget()
# 創(chuàng)建網(wǎng)格布局對象
layout = QtWidgets.QGridLayout()
label1 = QtWidgets.QLabel('Nan')
lineedit1 = QtWidgets.QLineEdit()
label2 = QtWidgets.QLabel('Nan')
lineedit2 = QtWidgets.QLineEdit()
layout.addWidget(label1, 1, 1)
layout.addWidget(lineedit1, 1, 2)
layout.addWidget(label2, 2, 1)
layout.addWidget(lineedit2, 2, 2)
# 信號與槽的連接
lineedit1.textChanged.connect(label1.setText)
lineedit2.textChanged.connect(label2.setText)
window.setLayout(layout)
window.show()
app.exec_()
運行截圖:
新控件QLineEdit
用來編輯單行文本的控件默伍。網(wǎng)格布局可以指定控件具體的位置。如果跨行或跨列設置的話,沒有控件的位置會被設置為空也糊。
QStackedLayout
from PySide2 import QtWidgets, QtCore
app = QtWidgets.QApplication()
window = QtWidgets.QWidget()
layout = QtWidgets.QVBoxLayout()
stacked_layout = QtWidgets.QStackedLayout()
combobox = QtWidgets.QComboBox()
combobox.addItems(['page1', 'page2', 'page3'])
layout.addWidget(combobox)
# 這里進行了嵌套布局炼蹦,所以布局都是可以嵌套的
layout.addLayout(stacked_layout)
btn1 = QtWidgets.QPushButton('btn1')
btn2 = QtWidgets.QPushButton('btn2')
btn3 = QtWidgets.QPushButton('btn3')
stacked_layout.addWidget(btn1)
stacked_layout.addWidget(btn2)
stacked_layout.addWidget(btn3)
combobox.activated.connect(stacked_layout.setCurrentIndex)
window.setLayout(layout)
window.show()
app.exec_()
QStackedLayout
如果要切換的話,需要使用其它控件來給它發(fā)送信號显设。比如這里使用了QComboBox
控件框弛,一個下拉列表,每次切換下拉列表的內容捕捂,相應頁面也會進行變化瑟枫。QFormLayout
和QGridLayout
很相似,一般表格提交頁面都會使用QFormLayout
布局指攒,就不再舉例慷妙。
友情鏈接:
QHBoxLayout
QVBoxLayout
QLCDNumber
QGridLayout
QStackedLayout
QLineEdit
QComboBox