PyQt5クイックスタート(5)PyQt5レイアウトマネージャ
、GUIレイアウトマネージャプロファイル
PyQt5インタフェースレイアウトを管理するための方法は、本質的に2つの構成され、一方は絶対位置であり、それはレイアウトマネージャを使用することです。Qtは適応的にウィンドウを変更できない絶対配置を使用してレイアウトした後、Qtがこうしてコンポーネントレイアウトマネージャのクラスへのインタフェースを提供する、インターフェイスコンポーネントを管理するため、インタフェースコンポーネントが自動的にウィンドウ、ウィンドウのサイズ変更に整列させることができます自動インターフェース・コンポーネントのサイズを更新します。
QLayout QtはQLayoutの継承によって異なる機能と相補レイアウトマネージャを達成する、抽象基底クラスレイアウトマネージャです。レイアウトマネージャインターフェースアセンブリはないが、ポジショニング戦略インタフェースコンポーネント;任意の容器アセンブリのタイプは、レイアウトマネージャを指定することができ、レイアウト管理とコンポーネント・マネージャは、同じ親コンポーネントを有する、それはレイアウトマネージャを受信した提供しました暗黙的に親子関係を指定します。
レイアウトマネージャを制御するaddWidgetを挿入するためのQtのレイアウトマネージャは、レイアウトマネージャは、レイアウトマネージャを挿入addLayout。
第二に、ボックスレイアウト
1、QHBoxLayout
QHBoxLayoutレベルレイアウト管理を制御する方法を提供します。
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QHBoxLayout, QPushButton, QSizePolicy
class MainWindow(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.layout = QHBoxLayout()
self.layout.setSpacing(20)
button = QPushButton("Button1")
button.setMinimumSize(60, 30)
button.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
self.layout.addWidget(button)
button = QPushButton("Button2")
button.setMinimumSize(60, 30)
button.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
self.layout.addWidget(button)
self.setLayout(self.layout)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.resize(400, 200)
window.show()
sys.exit(app.exec_())
2、QVBoxLayout
QVBoxLayoutは、垂直方向のレイアウト管理を制御する方法を提供します。
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton, QSizePolicy
class MainWindow(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.layout = QVBoxLayout()
self.layout.setSpacing(20)
button = QPushButton("Button1")
button.setMinimumSize(60, 30)
button.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
self.layout.addWidget(button)
button = QPushButton("Button2")
button.setMinimumSize(60, 30)
button.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
self.layout.addWidget(button)
self.setLayout(self.layout)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.resize(400, 200)
window.show()
sys.exit(app.exec_())
3、ネストされたレイアウト
レイアウトマネージャは、複雑なレイアウト管理を形成するように互いに入れ子にすることができます。QBoxLayoutネストされたレイアウトマネージャのインスタンスを次のように
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QSizePolicy
class MainWindow(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.layout = QVBoxLayout()
self.layout.setSpacing(20)
# 第一行按钮布局管理
hLayout1 = QHBoxLayout()
button = QPushButton("Button1")
button.setMinimumSize(60, 30)
button.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
hLayout1.addWidget(button)
button = QPushButton("Button2")
button.setMinimumSize(60, 30)
button.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
hLayout1.addWidget(button)
# 第二行按钮布局管理
hLayout2 = QHBoxLayout()
button = QPushButton("Button1")
button.setMinimumSize(60, 30)
button.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
hLayout2.addWidget(button)
button = QPushButton("Button2")
button.setMinimumSize(60, 30)
button.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
hLayout2.addWidget(button)
# 整体垂直布局管理
self.layout.addLayout(hLayout1)
self.layout.addLayout(hLayout2)
self.setLayout(self.layout)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.resize(400, 200)
window.show()
sys.exit(app.exec_())
第三に、グリッドレイアウト
QGridLayoutグリッドレイアウトマネージャは、インターフェース・コンポーネントを管理します。
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QGridLayout, QPushButton, QSizePolicy
class MainWindow(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.layout = QGridLayout()
self.layout.setSpacing(5)
button = QPushButton("Button1")
button.setMinimumSize(60, 30)
button.setSizePolicy(QSizePolicy.Expanding,QSizePolicy.Expanding)
self.layout.addWidget(button, 0, 0, 1, 1)
button = QPushButton("Button2")
button.setMinimumSize(60, 30)
button.setSizePolicy(QSizePolicy.Expanding,QSizePolicy.Expanding)
self.layout.addWidget(button, 0, 1, 1, 1)
button = QPushButton("Button3")
button.setMinimumSize(60, 30)
button.setSizePolicy(QSizePolicy.Expanding,QSizePolicy.Expanding)
self.layout.addWidget(button, 1, 0, 1, 1)
button = QPushButton("Button4")
button.setMinimumSize(60, 30)
button.setSizePolicy(QSizePolicy.Expanding,QSizePolicy.Expanding)
self.layout.addWidget(button, 1, 1, 1, 1)
button = QPushButton("Button5")
button.setMinimumSize(60, 30)
button.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
# 列扩展,定位在第2行第1列位置,占1行2列
self.layout.addWidget(button, 2, 0, 1, 2)
self.setLayout(self.layout)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.resize(400, 200)
window.show()
sys.exit(app.exec_())
第四に、フォームのレイアウト
QFormLayoutレイアウトマネージャは、インタフェースコンポーネント形式の管理を使用して、フォームおよびラベルコンポーネントは、互いに対応する関係、支持巣です。
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QFormLayout, QVBoxLayout, QLineEdit
from PyQt5.QtCore import Qt
class MainWindow(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.layout = QFormLayout()
self.layout.setSpacing(20)
self.layout.setLabelAlignment(Qt.AlignLeft)
self.layout.setFormAlignment(Qt.AlignRight)
nameEdit = QLineEdit()
mailEdit = QLineEdit()
vLayout = QVBoxLayout()
vLayout.setSpacing(6)
addrEdit1 = QLineEdit()
addrEdit2 = QLineEdit()
vLayout.addWidget(addrEdit1)
vLayout.addWidget(addrEdit2)
self.layout.addRow("Name:", nameEdit)
self.layout.addRow("Mail:", mailEdit)
self.layout.addRow("Address:", vLayout)
self.setLayout(self.layout)
self.setWindowTitle("FTP")
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.resize(400, 200)
window.show()
sys.exit(app.exec_())
第五に、スタックレイアウト
画面に垂直な方向の全ての成分QStackedLayoutスタッカレイアウト管理は、唯一のインタフェースコンポーネントがあれば、トップレベル・インターフェース・コンポーネントが表示されるように、画面上に表示されます。
スタックレイアウトマネージャは、以下QStackedLayout機能:
A、成分同じサイズ、親コンポーネントの完全な表示領域
Bには、他の直接ネストされたレイアウトマネージャーにすることはできません
Cは、スイッチアセンブリは自由に表示することができる
のみ表示され、Dはインタフェースコンポーネント
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QStackedLayout, QVBoxLayout, QPushButton
class MainWindow(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.layout = QStackedLayout()
self.layout.addWidget(QPushButton("Button1"))
self.layout.addWidget(QPushButton("Button2"))
self.layout.addWidget(QPushButton("Button3"))
self.layout.addWidget(QPushButton("Button4"))
self.setLayout(self.layout)
self.setWindowTitle("Stack Layout")
# 设置栈顶显示第2个组件
self.layout.setCurrentIndex(2)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.resize(400, 200)
window.show()
sys.exit(app.exec_())
QStackedLayoutスタックレイアウトマネージャは、直接他のレイアウトマネージャを入れ子にすることができないが、レイアウトマネージャQWidgetの容器組立体によって間接的に相互に入れ子にすることができます。
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QStackedLayout, QVBoxLayout, QPushButton
class MainWindow(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.layout = QStackedLayout()
self.layout.addWidget(QPushButton("Button1"))
# 容器型组件
widget = QWidget()
vLayout = QVBoxLayout()
vLayout.addWidget(QPushButton("Button2"))
vLayout.addWidget(QPushButton("Button3"))
widget.setLayout(vLayout)
self.layout.addWidget(widget)
self.layout.addWidget(QPushButton("Button4"))
self.setLayout(self.layout)
self.setWindowTitle("Stack Layout")
# 设置栈顶显示第1个组件
self.layout.setCurrentIndex(1)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.resize(400, 200)
window.show()
sys.exit(app.exec_())
第六に、スプリッタ
QSplitterは、レイアウトマネージャは、広帯域setHandleWidth()関数の分割によって設定されるストライプ(スプリッタハンドル)で切断されています。QSplitterは、指定された方向荷重順に配置されたサブコンポーネントは、setOrientation方向()関数を分割することにより特定することができます。
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QTextEdit, QVBoxLayout, QSplitter
from PyQt5.QtCore import Qt
class MainWindow(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.layout = QVBoxLayout()
self.mainSplitter = QSplitter(self)
self.layout.addWidget(self.mainSplitter)
self.setLayout(self.layout)
# 水平线分割
self.mainSplitter.setOrientation(Qt.Horizontal)
rightSplitter = QSplitter(self)
# 垂直线分割
rightSplitter.setOrientation(Qt.Vertical)
textEdit = QTextEdit()
textEdit.setText("Window2")
rightSplitter.addWidget(textEdit)
textEdit = QTextEdit()
textEdit.setText("Window3")
rightSplitter.addWidget(textEdit)
textEdit = QTextEdit()
textEdit.setText("Window1")
self.mainSplitter.addWidget(textEdit)
self.mainSplitter.addWidget(rightSplitter)
# 分割比例
self.mainSplitter.setStretchFactor(0, 1)
self.mainSplitter.setStretchFactor(1, 2)
self.mainSplitter.show()
self.setWindowTitle("Splitter")
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.resize(400, 200)
window.show()
sys.exit(app.exec_())