返回顶部

布局管理之 QStackedLayout (堆 布局)

QStackedLayout 描述:

提供了一个堆叠起来的布局,在同一时刻只能显示一个控件,里面提供了相关方法,可以切换控件。

 

QStackedLayout 功能作用:

 

构造函数:

from PyQt5.Qt import * #刚开始学习可以这样一下导入
import sys

class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("QStackedLayout的学习")
        self.resize(400,400)
        self.set_ui()


    def set_ui(self):
        stackedLayout = QStackedLayout()

        self.setLayout(stackedLayout)  #一般先设置它 

        label1= QLabel("标签1")
        label1.setStyleSheet("background-color:red;")
        label2= QLabel("标签2")
        label2.setStyleSheet("background-color:green;")
        label3= QLabel("标签3")
        label3.setStyleSheet("background-color:yellow;")
        label4= QLabel("标签4")
        label4.setStyleSheet("background-color:cyan;")
        label5= QLabel("标签5")
        label5.setStyleSheet("background-color:blue;")

        v_layout = QVBoxLayout()
        v_layout.addWidget(label4)
        v_layout.addWidget(label5)

        stackedLayout.addWidget(label1)
        stackedLayout.addWidget(label2)
        stackedLayout.addWidget(label3)



if __name__ == '__main__':
    app =QApplication(sys.argv)

    window = Window()
    window.show()

    sys.exit(app.exec_())
View Code

 

 

添加子控件:

 

获取子控件:

 

 

切换:

from PyQt5.Qt import * #刚开始学习可以这样一下导入
import sys

class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("QStackedLayout的学习")
        self.resize(400,400)
        self.set_ui()


    def set_ui(self):
        stackedLayout = QStackedLayout()

        self.setLayout(stackedLayout)  #一般先设置它

        label1= QLabel("标签1")
        label1.setStyleSheet("background-color:red;")
        label2= QLabel("标签2")
        label2.setStyleSheet("background-color:green;")
        label3= QLabel("标签3")
        label3.setStyleSheet("background-color:yellow;")
        label4= QLabel("标签4")
        label4.setStyleSheet("background-color:cyan;")
        label5= QLabel("标签5")
        label5.setStyleSheet("background-color:blue;")

        v_layout = QVBoxLayout()
        v_layout.addWidget(label4)
        v_layout.addWidget(label5)

        stackedLayout.addWidget(label1)
        stackedLayout.addWidget(label2)
        stackedLayout.addWidget(label3)


        #轮流显示 各个标签
        timer = QTimer(self)
        def timeout_slot():
            stackedLayout.setCurrentIndex((stackedLayout.currentIndex()+1)%stackedLayout.count())
        timer.timeout.connect(timeout_slot)
        timer.start(500)



if __name__ == '__main__':
    app =QApplication(sys.argv)

    window = Window()
    window.show()

    sys.exit(app.exec_())
View Code

 

展示模式:

from PyQt5.Qt import * #刚开始学习可以这样一下导入
import sys

class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("QStackedLayout的学习")
        self.resize(400,400)
        self.set_ui()


    def set_ui(self):
        stackedLayout = QStackedLayout()

        self.setLayout(stackedLayout)  #一般先设置它

        label1= QLabel("标签1")
        label1.setStyleSheet("background-color:red;")
        label2= QLabel("标签2")
        label2.setStyleSheet("background-color:green;")
        label3= QLabel("标签3")
        label3.setStyleSheet("background-color:yellow;")
        label4= QLabel("标签4")
        label4.setStyleSheet("background-color:cyan;")
        label5= QLabel("标签5")
        label5.setStyleSheet("background-color:blue;")

        v_layout = QVBoxLayout()
        v_layout.addWidget(label4)
        v_layout.addWidget(label5)

        stackedLayout.addWidget(label1)
        stackedLayout.addWidget(label2)
        stackedLayout.addWidget(label3)

            # label1.hide()  #此时后面的也不会显示出来

            # stackedLayout.setStackingMode(QStackedLayout.StackAll)
            # label1.hide()  # 此时,如果label1 不显示,它后面的也会显示

            # stackedLayout.setStackingMode(QStackedLayout.StackAll)
            # label1.setFixedSize(100,100)
        






if __name__ == '__main__':
    app =QApplication(sys.argv)

    window = Window()
    window.show()

    sys.exit(app.exec_())
View Code

 

信号:

from PyQt5.Qt import * #刚开始学习可以这样一下导入
import sys

class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("QStackedLayout的学习")
        self.resize(400,400)
        self.set_ui()


    def set_ui(self):
        stackedLayout = QStackedLayout()

        self.setLayout(stackedLayout)  #一般先设置它

        label1= QLabel("标签1")
        label1.setStyleSheet("background-color:red;")
        label2= QLabel("标签2")
        label2.setStyleSheet("background-color:green;")
        label3= QLabel("标签3")
        label3.setStyleSheet("background-color:yellow;")
        label4= QLabel("标签4")
        label4.setStyleSheet("background-color:cyan;")
        label5= QLabel("标签5")
        label5.setStyleSheet("background-color:blue;")

        v_layout = QVBoxLayout()
        v_layout.addWidget(label4)
        v_layout.addWidget(label5)

        stackedLayout.addWidget(label1)
        stackedLayout.addWidget(label2)
        stackedLayout.addWidget(label3)


        #轮流显示 各个标签
        timer = QTimer(self)
        def timeout_slot():
            stackedLayout.setCurrentIndex((stackedLayout.currentIndex()+1)%stackedLayout.count())
        timer.timeout.connect(timeout_slot)
        timer.start(500)

        #信号
        stackedLayout.currentChanged.connect(lambda val:print(val))



if __name__ == '__main__':
    app =QApplication(sys.argv)

    window = Window()
    window.show()

    sys.exit(app.exec_())
View Code
from PyQt5.Qt import * #刚开始学习可以这样一下导入
import sys

class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("QStackedLayout的学习")
        self.resize(400,400)
        self.set_ui()


    def set_ui(self):
        stackedLayout = QStackedLayout()

        self.setLayout(stackedLayout)  #一般先设置它

        label1= QLabel("标签1")
        label1.setStyleSheet("background-color:red;")
        label2= QLabel("标签2")
        label2.setStyleSheet("background-color:green;")
        label3= QLabel("标签3")
        label3.setStyleSheet("background-color:yellow;")
        label4= QLabel("标签4")
        label4.setStyleSheet("background-color:cyan;")
        label5= QLabel("标签5")
        label5.setStyleSheet("background-color:blue;")

        v_layout = QVBoxLayout()
        v_layout.addWidget(label4)
        v_layout.addWidget(label5)

        stackedLayout.addWidget(label1)
        stackedLayout.addWidget(label2)
        stackedLayout.addWidget(label3)

        #信号
        stackedLayout.removeWidget(label1)  #此时,后面也会自动显示  


if __name__ == '__main__':
    app =QApplication(sys.argv)

    window = Window()
    window.show()

    sys.exit(app.exec_())
View Code

补充 之 尺寸策略:

 

最小建议尺寸!

from PyQt5.Qt import * #刚开始学习可以这样一下导入
import sys

class MyLabel(QLabel):
    def minimumSizeHint(self):
        return QSize(200,200)  #最小建议尺寸


class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("布局管理器 尺寸策略的学习")
        self.resize(400,400)
        self.set_ui()


    def set_ui(self):
        label1= MyLabel("标签1")
        label1.setStyleSheet("background-color:red;")
        label2= QLabel("标签2")
        label2.setStyleSheet("background-color:green;")
        label3= QLabel("标签3")
        label3.setStyleSheet("background-color:yellow;")

        v_layout = QVBoxLayout()
        self.setLayout(v_layout)

        v_layout.addWidget(label1)
        v_layout.addWidget(label2)
        v_layout.addWidget(label3)



if __name__ == '__main__':
    app =QApplication(sys.argv)

    window = Window()
    window.show()

    sys.exit(app.exec_())
View Code

from PyQt5.Qt import * #刚开始学习可以这样一下导入
import sys

class MyLabel(QLabel):
    def sizeHint(self):
        return QSize(200,200)  #默认建议尺寸


class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("布局管理器 尺寸策略的学习")
        self.resize(400,400)
        self.set_ui()


    def set_ui(self):
        label1= MyLabel("标签1")
        label1.setStyleSheet("background-color:red;")
        label2= QLabel("标签2")
        label2.setStyleSheet("background-color:green;")
        label3= QLabel("标签3")
        label3.setStyleSheet("background-color:yellow;")

        v_layout = QVBoxLayout()
        self.setLayout(v_layout)

        v_layout.addWidget(label1)
        v_layout.addWidget(label2)
        v_layout.addWidget(label3)

        #现在的需求是:使label1 保持不变,不被拉缩
        label1.setSizePolicy(QSizePolicy.Fixed,QSizePolicy.Fixed)  #水平和垂直都设置不变
        #它这个固定尺寸是参照  默认建议尺寸大小来的, 建议尺寸可通过重写 sizeHint 来修改
            #如上


if __name__ == '__main__':
    app =QApplication(sys.argv)

    window = Window()
    window.show()

    sys.exit(app.exec_())
设定 固定策略

 

这里要说一个setFixedSize()  它不管什么策略不策略,它会直接修改,它的优先级是最高的!

 

总结:

以上就是所有的布局管理器! 下面看样式控制:QSS样式表!:https://www.cnblogs.com/zach0812/p/11403843.html

 

posted @ 2019-08-24 10:50  Zcb0812  阅读(2459)  评论(0编辑  收藏  举报