在 PySide6 中,窗口是放置小部件的容器。我們通常會用三種主要的窗口類型:
QMainWindow
: 主窗口一般會有一個內建的佈局,包含多個區塊。通常窗口頂部會有菜單欄,中間的中央是內 容區,下面會有狀態欄。
QWidget
: 沒有內建佈局,通常作為一個獨立的窗口,並且嵌入到其他窗口中。例如我們可以在 QWidget
放一些元件後,在嵌入到主窗口的內容區,實現靈活的介面佈局。
QDialog
: 和 QWidget
一樣沒有內建佈局,他跟 QWidget
最大的區別在於, QDialog
可以把窗口置頂,阻止用戶與其他窗口交互,直到把對話框關閉,才能進入。例如點進一些網站時,他會跳出一個對話框,要求用戶點擊「確定」,或關閉對話框後,才能繼續進行操作。
在介紹佈局之前,簡單說明一下 QLabel
:它是一個可以用來顯示文本、圖像或其他簡單內容的部件。在範例中,QLabel
只是用來示範佈局的方式。
佈局管理器決定了小部件在窗口中的排列方式。PySide6 提供了幾種常見的佈局管理器:
QVBoxLayout
: 垂直佈局,將小部件從上到下排列。下面範例是以QWidget作為基礎窗口,並把兩個QLable去做垂直排序。
from PySide6.QtWidgets import QApplication, QWidget, QLabel, QVBoxLayout
class MyWindow(QWidget):
def __init__(self):
super().__init__()
# 創建佈局
layout = QVBoxLayout()
# 創建標籤
label1 = QLabel("Label 1") # QLabel("標籤的文字")
label2 = QLabel("Label 2")
# 將標籤添加到佈局
layout.addWidget(label1)
layout.addWidget(label2)
# 設置窗口的佈局
self.setLayout(layout)
if __name__ == "__main__":
app = QApplication([])
window = MyWindow()
window.show()
app.exec()
QHBoxLayout
: 水平佈局,將小部件從左到右排列。下面範例是以QWidget作為基礎窗口,並把兩個QLable去做水平排序。
from PySide6.QtWidgets import QApplication, QWidget, QLabel, QHBoxLayout
class MyWindow(QWidget):
def __init__(self):
super().__init__()
# 創建佈局
layout = QHBoxLayout()
# 創建標籤
label1 = QLabel("Label 1")
label2 = QLabel("Label 2")
# 將標籤添加到佈局
layout.addWidget(label1)
layout.addWidget(label2)
# 設置窗口的佈局
self.setLayout(layout)
if __name__ == "__main__":
app = QApplication([])
window = MyWindow()
window.show()
app.exec()
QGridLayout
: 網格佈局,允許將小部件按行和列排列。
class MyWindow(QWidget):
def __init__(self):
super().__init__()
# 創建 QGridLayout 佈局
grid_layout = QGridLayout()
# 創建元件
label1 = QLabel("Label 1")
label2 = QLabel("Label 2")
label3 = QLabel("Label 3")
label4 = QLabel("Label 4")
# 將元件添加到網格中,指定行和列
grid_layout.addWidget(label1, 0, 0) # 第一行第一列
grid_layout.addWidget(label2, 0, 1) # 第一行第二列
grid_layout.addWidget(label3, 1, 0) # 第二行第一列
grid_layout.addWidget(label4, 1, 1) # 第二行第二列
# 設置窗口的佈局
self.setLayout(grid_layout)
if __name__ == "__main__":
app = QApplication([])
window = MyWindow()
window.show()
app.exec()
也可以使用 QVBoxLayout
和 QHBoxLayout
兩者同時使用形成網格佈局
from PySide6.QtWidgets import QApplication, QWidget, QLabel, QHBoxLayout, QVBoxLayout
class MyWindow(QWidget):
def __init__(self):
super().__init__()
# 創建佈局
QHlayout1 = QHBoxLayout() # 水平佈局1
QHlayout2 = QHBoxLayout() # 水平佈局2
QVlayout = QVBoxLayout() # 垂直佈局
# 創建標籤
label1 = QLabel("Label 1")
label2 = QLabel("Label 2")
label3 = QLabel("Label 3")
label4 = QLabel("Label 4")
# 將QLabel添加到QHlayout1
QHlayout1.addWidget(label1)
QHlayout1.addWidget(label2)
# 將QLabel添加到QHlayout2
QHlayout2.addWidget(label3)
QHlayout2.addWidget(label4)
# 將兩個水平佈局添加到垂直佈局
QVlayout.addLayout(QHlayout1) # 注意是使用 addLayout 新增佈局而不是 addWidget 新增元件
QVlayout.addLayout(QHlayout2)
# 設置窗口的佈局
self.setLayout(QVlayout)
if __name__ == "__main__":
app = QApplication([])
window = MyWindow()
window.show()
app.exec()
addLayout
和 addWidget
的差別如下addLayout
: 新增佈局,到當前的佈局。addWidget
: 新增元件、控件到當前的佈局。
QMainWindow
、 QWidget
和 QDialog
,三者的差別