PyQt的布局管理(一)

布局管理是GUI程序设计中的一个重要环节,在PyQt4中,使用的布局管理类有QHBoxLayout,QVBoxLayout,QGridLayout 3种,分别水平排列布局,垂直排列布局和表格排列布局。在布局管理中,常见的方法有addWidget()和addLayout()。addWidget()用于在布局中插入控件,addLayout()用于在布局中插入子布局!那么这他们之间的继承关系是什么呢?我们进入python的交互界面利用一些方法可以找到这些关系。具体如下:

>>> help(QtGui.QHBoxLayout)

class QHBoxLayout(QBoxLayout)

 |  QHBoxLayout()

 |  QHBoxLayout(QWidget)


>>> help(QtGui.QVBoxLayout)

class QVBoxLayout(QBoxLayout)
 |  QVBoxLayout()
 |  QVBoxLayout(QWidget)


>>> help(QtGui.QBoxLayout)
class QBoxLayout(QLayout)
 |  QBoxLayout(QBoxLayout.Direction, QWidget parent=None)


>>> help(QtGui.QGridLayout)
class QGridLayout(QLayout)
 |  QGridLayout(QWidget)
 |  QGridLayout()


通过上面的类之间的明确的关系,我们可以得到下图:







此脚本布局使用move方法移动,进行绝对布局。其中QLabel类是标签,是一个显示组件。

#!/usr/bin/env python
#coding: utf-8

#布局管理:如何在窗体上摆放窗口组件
#绝对布局

import sys
from PyQt4 import QtGui

#GUI label组件中需要打印的信息
class Example():
    def display(self):
        self.data = 'this is a test for layout display'


class Qlabel(QtGui.QWidget,Example):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        self.createLabel()

    def createLabel(self):
        label1 = QtGui.QLabel('Zetcode',self)
        label1.move(10,10)

        emp = Example()     #对父类Example进行实例化
        emp.display()           #调用父类Example的display函数,加载进入内存,使data属性写入实例对象的命名空间字典中!
        char = emp.data #利用char存储data属性值

        label2 = QtGui.QLabel(char,self)
        label2.move(10,40)

        self.setWindowTitle('AbsoluteLayout')
        self.resize(250,150)

def main():
    app = QtGui.QApplication(sys.argv)

    absolute_layout = Qlabel()
    absolute_layout.show()

    app.exec_()

if __name__ == '__main__':
    main()

下面的代码实现的功能和上面是一样 的,但是采用了布局管理类——QHBoxLayout(水平)、QVBoxLayout(垂直)

#!/usr/bin/env python
#coding: utf-8

#布局管理:如何在窗体上摆放窗口组件
#绝对布局

import sys
from PyQt4 import QtGui

#GUI label组件中需要打印的信息
class Example():
    def display(self):

self.data = 'this is a test for layout display' 
    

class Qlabel(QtGui.QWidget,Example):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        self.createLabel()
    
    def createLabel(self):
        label1 = QtGui.QLabel('Zetcode',self)
#       label1.move(10,10)
    
        emp = Example()     #对父类Example进行实例化
        emp.display()           #调用父类Example的display函数,加载进入内存,使data属性写入实例对象的命名空间字典中!
        char = emp.data #利用char存储data属性值
    
        label2 = QtGui.QLabel(char,self)
#       label2.move(10,40)
    
        layout = QtGui.QVBoxLayout()
        #layout.addStretch(1)
        layout.addWidget(label1)
        layout.addWidget(label2)
    
        self.setLayout(layout)
        self.setWindowTitle('AbsoluteLayout')
        self.resize(250,150)

    
def main():
    app = QtGui.QApplication(sys.argv)
    
    absolute_layout = Qlabel()
    absolute_layout.show()
    
    app.exec_()

if __name__ == '__main__':
    main()



转载于:https://my.oschina.net/yanxiaoshuai/blog/529637

PyQt中,布局管理器是用于组织和排列用户界面中的控件的重要工具。它能够确保控件在不同平台和窗口尺寸下都能正确呈现,并且具有良好的可伸缩性。以下是些常用的布局管理器及其使用方法: ### 垂直布局(QVBoxLayout) 垂直布局管理器(`QVBoxLayout`)按垂直方向依次排列窗口部件。通过将控件添加到垂直布局中,可以确保它们按照从上到下的顺序排列,并且会随着窗口大小的变化而自动调整。 ```python import sys from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton app = QApplication(sys.argv) window = QWidget() layout = QVBoxLayout() button1 = QPushButton("Button 1") button2 = QPushButton("Button 2") button3 = QPushButton("Button 3") layout.addWidget(button1) layout.addWidget(button2) layout.addWidget(button3) window.setLayout(layout) window.show() sys.exit(app.exec_()) ``` ### 水平布局(QHBoxLayout) 水平布局管理器(`QHBoxLayout`)按水平方向依次排列窗口部件。通过将控件添加到水平布局中,可以确保它们按照从左到右的顺序排列,并且会随着窗口大小的变化而自动调整。 ```python import sys from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout, QHBoxLayout class MyWindow(QWidget): def __init__(self): super().__init__() # 创建按钮 button1 = QPushButton('Button 1') button2 = QPushButton('Button 2') button3 = QPushButton('Button 3') # 创建垂直布局 vbox = QVBoxLayout() vbox.addWidget(button1) vbox.addWidget(button2) # 创建水平布局 hbox = QHBoxLayout() hbox.addWidget(button3) # 将水平布局添加到垂直布局中 vbox.addLayout(hbox) # 设置窗口的布局 self.setLayout(vbox) self.setWindowTitle('Layout Example') self.resize(300, 200) if __name__ == '__main__': app = QApplication(sys.argv) window = MyWindow() window.show() sys.exit(app.exec_()) ``` ### 网格布局(QGridLayout) 网格布局管理器(`QGridLayout`)允许将控件放置在个二维网格中。这使得控件可以以行和列的方式进行排列,非常适合用于创建复杂的用户界面。 ```python import sys from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QGridLayout app = QApplication(sys.argv) window = QWidget() grid_layout = QGridLayout() button1 = QPushButton("Button 1") button2 = QPushButton("Button 2") button3 = QPushButton("Button 3") button4 = QPushButton("Button 4") grid_layout.addWidget(button1, 0, 0) grid_layout.addWidget(button2, 0, 1) grid_layout.addWidget(button3, 1, 0) grid_layout.addWidget(button4, 1, 1) window.setLayout(grid_layout) window.setWindowTitle('Grid Layout Example') window.show() sys.exit(app.exec_()) ``` ### 动态布局(QSplitter) `QSplitter`是种动态布局管理器,它允许用户手动调整区域的大小,实现复杂嵌套布局结构,并提供直观的比例控制接口[^2]。这对于需要用户交互调整布局的应用非常有用。 ```python import sys from PyQt5.QtWidgets import QApplication, QWidget, QSplitter, QTextEdit, QPushButton app = QApplication(sys.argv) window = QWidget() splitter = QSplitter() text_edit1 = QTextEdit() text_edit2 = QTextEdit() splitter.addWidget(text_edit1) splitter.addWidget(text_edit2) # 可以添加更多控件 button = QPushButton("Click Me") splitter.addWidget(button) window.setLayout(splitter) window.setWindowTitle('Splitter Layout Example') window.show() sys.exit(app.exec_()) ``` ### 总结 通过使用上述布局管理器,开发者可以根据具体需求创建灵活且专业的用户界面。无论是简单的垂直或水平布局,还是复杂的网格布局或动态布局PyQt都提供了丰富的工具来满足不同的界面设计需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值