zoukankan      html  css  js  c++  java
  • pyQt 流布局的一个例子

    瀑布流布局

    from PyQt5.QtCore import QPoint, QRect, QSize, Qt
    from PyQt5.QtWidgets import (QApplication, QLayout, QPushButton, QSizePolicy, QWidget, QGridLayout)
    
    
    class Window(QWidget):
        def __init__(self):
            super(Window, self).__init__()
            self.resize(400, 300)
    
            flowLayout = FlowLayout()
    
            for i in range(10):
                layout = QGridLayout()
                layout.addWidget(QPushButton("btn1"))
                layout.addWidget(QPushButton("btn2"))
            
                widget = QWidget()
                widget.setLayout(layout)
                flowLayout.addWidget(widget)
    
            self.setLayout(flowLayout)
    
            self.setWindowTitle("Flow Layout")
    
    class FlowLayout(QLayout):
        def __init__(self, parent=None, margin=0, spacing=-1):
            super(FlowLayout, self).__init__(parent)
    
            if parent is not None:
                self.setContentsMargins(margin, margin, margin, margin)
    
            self.setSpacing(spacing)
    
            self.itemList = []
    
        def __del__(self):
            item = self.takeAt(0)
            while item:
                item = self.takeAt(0)
    
        def addItem(self, item):
            self.itemList.append(item)
    
        def count(self):
            return len(self.itemList)
    
        def itemAt(self, index):
            if index >= 0 and index < len(self.itemList):
                return self.itemList[index]
    
            return None
    
        def takeAt(self, index):
            if index >= 0 and index < len(self.itemList):
                return self.itemList.pop(index)
    
            return None
    
        def expandingDirections(self):
            return Qt.Orientations(Qt.Orientation(0))
    
        def hasHeightForWidth(self):
            return True
    
        def heightForWidth(self, width):
            height = self.doLayout(QRect(0, 0, width, 0), True)
            return height
    
        def setGeometry(self, rect):
            super(FlowLayout, self).setGeometry(rect)
            self.doLayout(rect, False)
    
        def sizeHint(self):
            return self.minimumSize()
    
        def minimumSize(self):
            size = QSize()
    
            for item in self.itemList:
                size = size.expandedTo(item.minimumSize())
    
            margin, _, _, _ = self.getContentsMargins()
    
            size += QSize(2 * margin, 2 * margin)
            return size
    
        def doLayout(self, rect, testOnly):
            x = rect.x()
            y = rect.y()
            lineHeight = 0
    
            for item in self.itemList:
                wid = item.widget()
                spaceX = self.spacing() + wid.style().layoutSpacing(QSizePolicy.PushButton,
                                                                    QSizePolicy.PushButton, Qt.Horizontal)
                spaceY = self.spacing() + wid.style().layoutSpacing(QSizePolicy.PushButton,
                                                                    QSizePolicy.PushButton, Qt.Vertical)
                nextX = x + item.sizeHint().width() + spaceX
                if nextX - spaceX > rect.right() and lineHeight > 0:
                    x = rect.x()
                    y = y + lineHeight + spaceY
                    nextX = x + item.sizeHint().width() + spaceX
                    lineHeight = 0
    
                if not testOnly:
                    item.setGeometry(QRect(QPoint(x, y), item.sizeHint()))
    
                x = nextX
                lineHeight = max(lineHeight, item.sizeHint().height())
    
            return y + lineHeight - rect.y()
    
    
    if __name__ == '__main__':
    
        import sys
    
        app = QApplication(sys.argv)
        mainWin = Window()
        mainWin.show()
        sys.exit(app.exec_())
  • 相关阅读:
    23. 霍纳法则(多项式求值快速算法)
    22. 欧几里德算法(求最大公约数GCD)
    [poj 2106] Boolean Expressions 递归
    [poj 1185] 炮兵阵地 状压dp 位运算
    [MOOC程序设计与算法二] 递归二
    [poj 3254] Corn Fields 状压dp
    [hdu 1074] Doing Homework 状压dp
    [hdu 1568] Fibonacci数列前4位
    [haut] 1281: 邪能炸弹 dp
    [hdu 2604] Queuing 递推 矩阵快速幂
  • 原文地址:https://www.cnblogs.com/6min/p/11246568.html
Copyright © 2011-2022 走看看