亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術(shù)文章
文章詳情頁

python GUI框架pyqt5 對圖片進行流式布局的方法(瀑布流flowlayout)

瀏覽:40日期:2022-08-02 16:20:43

流式布局

流式布局,也叫做瀑布流布局,是網(wǎng)頁中經(jīng)常使用的一種頁面布局方式,它的原理就是將高度固定,然后圖片的寬度自適應(yīng),這樣加載出來的圖片看起來就像瀑布一樣整齊的水流淌下來。

pyqt流式布局

那么在pyqt5中我們怎么使用流式布局呢?pyqt沒有這個控件,需要我們自己去封裝,下面是流式布局的封裝代碼。

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()

封裝好的流式布局類,我們只要傳入相應(yīng)的layout之后,他就會自動計算頁面的元素,適應(yīng)頁面的寬度。

下面是我們寫的一個瀑布流顯示圖片的代碼:

from PyQt5.QtCore import QPoint, QRect, QSize, Qtimport osfrom PyQt5 import QtCore, QtGui, QtWidgetsfrom PyQt5.QtWidgets import ( QApplication, QLayout, QPushButton, QSizePolicy, QWidget, QGridLayout)class Window(QWidget): def __init__(self): self.imageheight = 100 super(Window, self).__init__() self.resize(400, 300) flowLayout = FlowLayout() highlight_dir = './' self.files_it = iter([os.path.join(highlight_dir, file) for file in os.listdir(highlight_dir)]) print() for file in iter(self.files_it): layout = QGridLayout() pixmap = QtGui.QPixmap(file) if not pixmap.isNull():autoWidth = pixmap.width()*self.imageheight/pixmap.height()label = QtWidgets.QLabel(pixmap=pixmap)label.setScaledContents(True)label.setFixedHeight(self.imageheight)print(autoWidth)label.setFixedWidth(autoWidth)#label.setFixedSize(100, 50)layout.addWidget(label)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 + spaceYnextX = x + item.sizeHint().width() + spaceXlineHeight = 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_())

到此這篇關(guān)于python GUI框架pyqt5 對圖片進行流式布局的方法(瀑布流flowlayout)的文章就介紹到這了,更多相關(guān)python pyqt5圖片流式布局內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 天天干天天色综合网 | 日韩午夜大片 | 成人午夜在线观看国产 | 国产成人免费全部网站 | 91秒拍国产福利一区 | 韩国日本美国免费毛片 | 外国一级黄色片 | 一级香蕉视频在线观看 | 999精品影视在线观看 | 免费观看日本污污ww网站一区 | 精品一区二区日本高清 | 国产小妹 | 婷婷射图 | 成人综合在线观看 | 玖玖爱视频在线观看 | 亚洲成人三级 | 欧美国产综合视频在线观看 | 成人自拍网 | 成人黄色激情网站 | 亚洲国产日韩欧美 | 女毛片| 国产三级日本三级在线播放 | 九九精品在线播放 | 欧美日韩国产免费一区二区三区 | 黄片123| 日本福利片 | 性网站在线 | 久久99综合国产精品亚洲首页 | 成人毛片网 | 午夜成人免费影院 | 91久久精品午夜一区二区 | 在线播放国产一区二区三区 | www亚洲一区 | 国产高清色视频免费看的网址 | 精品国产丝袜自在线拍国 | 大尺度做爰床戏呻吟免费观看91 | 国产精品第一区第27页 | 国产拍拍1000部ww | 图片区亚洲色图 | 黄色片免费| 日韩电影久久久被窝网 |