python GUI框架流式布局pyqt5图片瀑布流布局

还不会流式布局?

流式布局,也叫做瀑布流布局,是网页中经常使用的一种页面布局方式,它的原理就是将高度固定,然后图片的宽度自适应,这样加载出来的图片看起来就像瀑布一样整齐的水流淌下来。

那么在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()

封装好的流式布局类,我们只要传入相应的layout之后,他就会自动计算页面的元素,适应页面的宽度。

下面是我们写的一个瀑布流显示图片的代码:

from PyQt5.QtCore import QPoint, QRect, QSize, Qt

import os

from PyQt5 import QtCore, QtGui, QtWidgets

from 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 + 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_())

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Python GUI界面实例PyQt5是一种基于Python编程语言的图形用户界面(GUI)工具包。它提供了一种简单易用的方式来创建各种类型的GUI应用程序,包括桌面应用程序、游戏、工具和其他应用程序。PyQt5是一个开源的工具包,可以在Windows、Linux和Mac OS X等操作系统上使用。它提供了丰富的控件和功能,可以帮助开发人员快速创建高质量的GUI应用程序。PyQt5还提供了一些示例代码和教程,可以帮助开发人员学习如何使用它来创建GUI应用程序。 ### 回答2: Python GUI界面已经成为了Python编程中重要的一部分。Python GUI界面框架有很多,其中PyQt5是最流行的Python GUI框架之一。PyQt5是基于Qt框架python界面设计模块,其功能强大,易用性高,支持多种常见操作系统,包括Windows、Mac OS X、Linux等等。下面是Python GUI界面实例PyQt5的相关介绍。 1. 安装PyQt5 PyQt5可以通过pip工具进行安装,安装过程简单方便。使用pip install PyQt5安装PyQt5。 2. PyQt5主窗口 PyQt5主窗口可以通过QMainWindow进行创建,主窗口可以包括菜单栏、工具栏、状态栏、中心区域和各种控件等内容。 3. PyQt5控件 PyQt5控件是构成界面的基本元素。常用控件有按钮、标签、文本框、列表框、滚动条、复选框等等。PyQt5还支持布局方式,常用的布局方式包括水平布局、竖直布局、网格布局等等。 4. PyQt5信号与槽 PyQt5信号与槽用于处理用户界面的事件,如按钮被单击、文本框输入等等。信号与槽模型可以实现多个对象之间的通信。 5. PyQt5样式设计 PyQt5支持多种样式设计,用户可以通过样式表控制界面的底色、前景色、字体、大小等等。 6. PyQt5图像处理 PyQt5支持多种图像处理方式,如显示图像、裁剪图像、缩放图像、转换图像等等。 PyQt5还支持多种图形绘制方式,如线条、矩形、椭圆、圆形、多边形等等。 7. PyQt5数据库编程 PyQt5与多种数据库进行连接,可以进行数据库的交互。通过连接数据库,用户可以实现数据的查询、删除、插入等操作。 8. PyQt5多线程编程 PyQt5支持多线程编程,可以实现程序的异步处理。多线程编程可以实现程序的高效运行。 总之,PyQt5是一个功能强大的GUI框架,可以用于快速开发高质量的用户界面。其支持多种控件、具有良好的样式设计和图像处理能力,并且支持多种编程模式,如信号与槽、多线程编程等等。PyQt5不仅可以用于桌面应用程序的开发,而且可以用于Web应用程序的开发。 ### 回答3: PythonGUI界面开发非常便捷。PyQt5Python的一个GUI框架,它提供了一些工具,用于开发跨平台应用程序。PyQt5结合了Qt库和Python编程语言,充分利用了两者的优势。 PyQt5提供一个很好的例子,那就是PyQt5的IDE——Qt Designer。通过这个IDE,我们可以很容易地创建GUI界面。Qt Designer支持可视化设计和绑定Python代码的功能,能够让开发者轻松地创建GUI界面,同时也能够方便地绑定Python代码。 PyQt5生成的界面是一个PY文件,它包含了界面代码和它所使用的相关组件的定义。这个文件可以被导入,以便其他Python代码可以使用它。使用PyQt5 API,我们可以修改和修饰这个界面。PyQt5提供了一些很有用的工具来完成这个任务。 下面我们来看一个简单的例子。假设我们需要创建一个简单的GUI界面。首先,我们需要在Qt Designer中创建一个见面,并保存为myui.ui。接下来,我们要将这个UI转换为Python文件(myui.py)。使用PyUic工具可以很容易地完成这个任务。使用命令行:pyuic5 myui.ui -o myui.py,就可以将UI文件转换成Python文件。 然后我们就可以使用Python代码来使用这个GUI界面。下面是一个示例代码: import sys from PyQt5.QtWidgets import QApplication, QMainWindow from myui import Ui_MainWindow class MyApp(QMainWindow): def __init__(self): super().__init__() self.ui = Ui_MainWindow() self.ui.setupUi(self) if __name__ == '__main__': app = QApplication(sys.argv) window = MyApp() window.show() sys.exit(app.exec_()) 在这个例子中,我们首先导入了需要的库。接下来我们创建了一个类MyApp,这个类继承自QMainWindow,我们在初始化函数中使用了Ui_MainWindow()类。这个类是我们之前创建的myui.py中的类。我们通过调用setupUi()函数来对窗口进行设置。 最后,我们创建了一个应用程序对象,并实例化了MyApp类,同时显示应用程序。最后,我们让应用程序等待窗口的关闭,并退出应用程序。 总结来说,PyQt5提供了一个很好的工具来创建GUI界面。我们可以使用可视化界面设计器和代码生成工具来进行界面设计。同时,我们也可以使用Python来修饰和修改界面。这个框架可以轻松地跨平台开发GUI应用程序,并且可以非常简单地与Python代码集成。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晴天暖宝宝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值