この記事では主に、PyQt5 で毎日学ばなければならないレイアウト管理に関する関連情報を詳しく紹介します。興味のある方は参考にしてください。
GUI プログラミングでは無視できない部分があります。レイアウト管理です。レイアウト管理は、コントロールをアプリケーション ウィンドウにどのように配置するかを制御します。レイアウト管理は 2 つの方法で実行できます。絶対配置またはレイアウト クラス メソッドを使用して、プログラム ウィンドウ内のコントロールの位置を制御できます。
絶対配置
各コントロールはプログラマーが指定した位置に従って配置されます。絶対配置を使用する場合は、次の制限事項に注意してください:
ウィンドウのサイズを変更しても、コントロールのサイズと位置は変わりません
アプリケーションはプラットフォームによって異なる場合があります
フォントを変更すると、アプリケーションのレイアウトが破壊される可能性があります
レイアウトを変更する場合は、各コントロールを完全に変更する必要があり、面倒で時間がかかります
次の例は、絶対座標配置方法です。コントロールの。
#!/usr/bin/python3 # -*- coding: utf-8 -*- """ PyQt5 教程 这个例子显示了在窗口中使用绝对定位的三个标签。 作者:我的世界你曾经来过 博客:http://blog.csdn.net/weiaitaowang 最后编辑:2016年7月31日 """ import sys from PyQt5.QtWidgets import QApplication, QWidget, QLabel class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): lbl1 = QLabel('我的世界你曾经来过', self) lbl1.move(15, 10) lbl2 = QLabel('CSND博客', self) lbl2.move(35, 40) lbl3 = QLabel('程序员', self) lbl3.move(55, 70) self.setGeometry(300, 300, 250, 150) self.setWindowTitle('绝对定位') self.show() if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
この例では、ラベルが使用されています。 x および y 座標値を指定することでそれらを配置します。座標系の原点は、コントロールの左上隅です。 x の値は左から右に増加します。 y 値は上から下に向かって増加します。
lbl1 = QLabel('我的世界你曾经来过', self) lbl1.move(15, 10)
ラベル コントロールは x=15 と y=10 に配置されます。
プログラム実行後
ボックスレイアウトボックスレイアウト
レイアウト管理は、より柔軟で実用的なレイアウトクラスを使用します。これは、コントロールをウィンドウに配置するための推奨される方法です。 QHBoxLayout と QVBoxLayout は、それぞれ水平方向と垂直方向に配置されたコントロールの基本レイアウト クラスです。
想像してみてください。プログラムの右下隅に 2 つのボタンを配置したいとします。このようなレイアウトを作成するには、水平方向と垂直方向の 2 つのボックスを使用します。必要な空きスペースを作成するために、ストレッチ係数を追加します。
#!/usr/bin/python3 # -*- coding: utf-8 -*- """ PyQt5 教程 在这个例子中,我们在窗口的右下角放置两个按钮。 作者:我的世界你曾经来过 博客:http://blog.csdn.net/weiaitaowang 最后编辑:2016年7月31日 """ import sys from PyQt5.QtWidgets import (QApplication, QWidget, QPushButton, QVBoxLayout, QHBoxLayout) class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): okButton = QPushButton('确定') cancelButton = QPushButton('取消') hbox = QHBoxLayout() hbox.addStretch(1) hbox.addWidget(okButton) hbox.addWidget(cancelButton) vbox = QVBoxLayout() vbox.addStretch(1) vbox.addLayout(hbox) self.setLayout(vbox) self.setGeometry(300, 300, 350, 150) self.setWindowTitle('Box布局') self.show() if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
この例では、ウィンドウの右下隅に 2 つのボタンを配置します。アプリケーションウィンドウのサイズを変更すると、ウィンドウは右下隅に固定されます。 HBoxLayout と QVBoxLayout の両方のレイアウトを使用します。
okButton = QPushButton('确定') cancelButton = QPushButton('取消')
ここでは 2 つのボタンを作成しました。
hbox = QHBoxLayout() hbox.addStretch(1) hbox.addWidget(okButton) hbox.addWidget(cancelButton)
水平ボックスレイアウトを作成し、ストレッチ係数を増やし(addStretch)、2つのボタンを追加(addWidget)しました。 2 つのボタンを追加する前にストレッチ係数を追加しました。これにより、2 つのボタンがウィンドウの右側に押し出されます。
vbox = QVBoxLayout() vbox.addStretch(1) vbox.addLayout(hbox)
希望のレイアウトを取得するには、水平レイアウトを垂直レイアウトに配置する必要もあります。垂直ボックスのストレッチ係数により、内部のコントロールを含む水平ボックスがウィンドウの下部に押し込まれます。
self.setLayout(vbox)
最後に、ウィンドウのメインレイアウトを設定します。
プログラム実行後
QGridLayoutグリッドレイアウト
最も一般的に使用されるレイアウトクラスはグリッドレイアウトです。このレイアウトでは、スペースが行と列に分割されます。グリッド レイアウトを作成するには、QGridLayout クラスを使用します。
#!/usr/bin/python3 # -*- coding: utf-8 -*- """ PyQt5 教程 在这个例子中,我们使用网格布局创建一个计算器的框架。 作者:我的世界你曾经来过 博客:http://blog.csdn.net/weiaitaowang 最后编辑:2016年7月31日 """ import sys from PyQt5.QtWidgets import (QApplication, QWidget, QPushButton, QGridLayout) class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): grid = QGridLayout() self.setLayout(grid) names = ['Cls', 'Bck', '', '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 button = QPushButton(name) grid.addWidget(button, *position) self.move(300, 150) self.setWindowTitle('计算器') self.show() if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
今回の場合、作成したボタンコントロールをグリッドに配置します。
grid = QGridLayout() self.setLayout(grid)
QGridLayoutをインスタンス化し、アプリケーションウィンドウのレイアウトを設定します。
names = ['Cls', 'Bck', '', 'Close', '7', '8', '9', '/', '4', '5', '6', '*', '1', '2', '3', '-', '0', '.', '=', '+',]
今後使用するボタンラベルです。
positions = [(i, j) for i in range(5) for j in range(4)]
x グリッドの場所のリストを作成しました。
for position, name in zip(positions, names): if name == '': continue button = QPushButton(name) grid.addWidget(button, *position)
ボタンを作成し、レイアウトに追加 (addWidget) します。
プログラムの実行後
グリッド レイアウトを展開します
ウィンドウ内のコントロールは、グリッド内の複数の列または行にまたがることができます。次の例では、これを説明します。
#!/usr/bin/python3 # -*- coding: utf-8 -*- """ PyQt5 教程 在这个例子中,我们使用GridLayout的跨行创建了一个更复杂的窗口布局。 作者:我的世界你曾经来过 博客:http://blog.csdn.net/weiaitaowang 最后编辑:2016年7月31日 """ import sys from PyQt5.QtWidgets import (QApplication, QWidget, QLabel, QTextEdit, QLineEdit, QGridLayout) class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): title = QLabel('标题') author = QLabel('作者') review = QLabel('评论') titleEdit = QLineEdit() authorEdit = QLineEdit() reviewEdit = QTextEdit() grid =QGridLayout() grid.setSpacing(10) grid.addWidget(title, 1, 0) grid.addWidget(titleEdit, 1, 1) grid.addWidget(author, 2, 0) grid.addWidget(authorEdit, 2, 1) grid.addWidget(review, 3, 0) grid.addWidget(reviewEdit, 3, 1, 5, 1) self.setLayout(grid) self.setGeometry(300, 300, 350, 300) self.setWindowTitle('评论') self.show() if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
私たちが作成したプログラムには、QGridLayout レイアウトを使用した、3 つのラベル、2 つの単行テキスト入力ボックス、およびテキスト編集コントロールが含まれています。
grid =QGridLayout() grid.setSpacing(10)
グリッドレイアウトをインスタンス化し、間隔を設定します。
grid.addWidget(reviewEdit, 3, 1, 5, 1)
グリッド レイアウトにコントロールを追加します。このコントロールには行スパンまたは列スパンを使用できます。この例では、reviewEdit コントロールが 5 行にまたがる必要があります。
プログラム実行後
PyQt5 チュートリアルのこの部分はレイアウト管理に特化しています。 PyQt5のイベント関連コンテンツは後ほど紹介します。
関連するおすすめ:
PyQt5は、ラベル付きのチェックボックスを毎日学習する必要があります
PyQt5は、ウィンドウ中央揃え効果を作成する方法を毎日学習する必要があります
PyQt5は、ウィンドウを閉じる方法を毎日学習する必要があります
以上がPyQt5で毎日学ばなければならないレイアウト管理の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。