美文网首页
PySide2学习记录(五):布局和布局嵌套

PySide2学习记录(五):布局和布局嵌套

作者: 3ni | 来源:发表于2018-11-23 08:39 被阅读0次

    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")
    
    # 创建一个垂直管理布局控件
    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_()
    

    QVBoxLayoutQHBoxLayout分别是垂直布局控件和水平布局控件。有些人可能有疑问,这里的button实例为什么都没有表明父类是谁,却能正常显示。这是因为这些按钮已经被layout收起来集中管理了,然后window设置了布局控件为layout,所以只要layout能正常工作,这些按钮就会显示出来。

    举例说明

    from PySide2 import QtWidgets, QtCore
    
    class MyWidget(QtWidgets.QWidget):
        def __init__(self, parent=None):
            super().__init__(parent)
    
            # 创建一个二位数的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会自动更新,因为已经连接了信号和槽
            self.slider.setValue(40)
            # 创建一个垂直管理布局控件
            self.layout = QtWidgets.QVBoxLayout()
            self.layout.addWidget(self.lcd)
            self.layout.addWidget(self.slider)
    
            self.setLayout(self.layout)
    
    
    app = QtWidgets.QApplication()
    window = QtWidgets.QWidget()
    # 创建一个水平管理布局控件
    layout = QtWidgets.QHBoxLayout()
    
    widget1 = MyWidget()
    widget2 = MyWidget()
    layout.addWidget(widget1)
    layout.addWidget(widget2)
    
    window.setLayout(layout)
    window.show()
    app.exec_()
    

    运行截图:

    图1

    上面有一个新控件就是QLCDNumber,用于显示数字的,然后自己定义了一个MyWidget类,包含了一个数码管和一个滑动条,并把它们放到了垂直布局里面。在window对象中创建了两个自定义对象和设置了水平布局。

    QGridLayout
    from PySide2 import QtWidgets, QtCore
    
    app = QtWidgets.QApplication()
    
    window = QtWidgets.QWidget()
    # 创建网格布局对象
    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_()
    

    运行截图:

    图2

    新控件QLineEdit用来编辑单行文本的控件。网格布局可以指定控件具体的位置。如果跨行或跨列设置的话,没有控件的位置会被设置为空。

    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如果要切换的话,需要使用其它控件来给它发送信号。比如这里使用了QComboBox控件,一个下拉列表,每次切换下拉列表的内容,相应页面也会进行变化。QFormLayoutQGridLayout很相似,一般表格提交页面都会使用QFormLayout布局,就不再举例。

    友情链接:
    QHBoxLayout
    QVBoxLayout
    QLCDNumber
    QGridLayout
    QStackedLayout
    QLineEdit
    QComboBox

    相关文章

      网友评论

          本文标题:PySide2学习记录(五):布局和布局嵌套

          本文链接:https://www.haomeiwen.com/subject/yqqgfqtx.html