动态加载图片
This commit is contained in:
parent
de452f9c32
commit
651924e9ef
4 changed files with 119 additions and 0 deletions
104
QTextBrowser/DynamicRes.py
Normal file
104
QTextBrowser/DynamicRes.py
Normal file
|
@ -0,0 +1,104 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
"""
|
||||||
|
Created on 2020/6/3
|
||||||
|
@author: Irony
|
||||||
|
@site: https://pyqt.site https://github.com/PyQt5
|
||||||
|
@email: 892768447@qq.com
|
||||||
|
@file: DynamicRes
|
||||||
|
@description:
|
||||||
|
"""
|
||||||
|
from threading import Thread
|
||||||
|
|
||||||
|
import requests
|
||||||
|
from PyQt5.QtCore import QUrl, QByteArray
|
||||||
|
from PyQt5.QtGui import QImage, QTextDocument
|
||||||
|
from PyQt5.QtWidgets import QTextBrowser, QWidget, QVBoxLayout, QPushButton
|
||||||
|
|
||||||
|
__Author__ = 'Irony'
|
||||||
|
__Copyright__ = 'Copyright (c) 2020'
|
||||||
|
__Version__ = 'Version 1.0'
|
||||||
|
|
||||||
|
|
||||||
|
class TextBrowser(QTextBrowser):
|
||||||
|
NetImages = {}
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
super(TextBrowser, self).__init__(*args, **kwargs)
|
||||||
|
self.setOpenLinks(False) # 禁止打开URL
|
||||||
|
|
||||||
|
def downloadImage(self, url):
|
||||||
|
try:
|
||||||
|
self.NetImages[url] = [QByteArray(requests.get(url.toString()).content), 1]
|
||||||
|
print('下载完成', url)
|
||||||
|
except Exception as e:
|
||||||
|
print('下载失败', url, e)
|
||||||
|
self.NetImages[url] = [QByteArray(), 1]
|
||||||
|
|
||||||
|
def loadResource(self, rtype, url):
|
||||||
|
ret = super(TextBrowser, self).loadResource(rtype, url)
|
||||||
|
# 加载图片资源
|
||||||
|
if rtype == QTextDocument.ImageResource:
|
||||||
|
if ret:
|
||||||
|
return ret
|
||||||
|
if url.toString().startswith('irony'): # 自定义的协议头
|
||||||
|
print('加载本地', '../Donate/zhifubao.png', url)
|
||||||
|
return QImage('../Donate/zhifubao.png') # 或者 QByteArray(open('../Donate/zhifubao.png', 'rb').read())
|
||||||
|
elif url.toString().startswith('http'): # 加载网络图片
|
||||||
|
img, status = self.NetImages.get(url, [None, None])
|
||||||
|
if url not in self.NetImages or status is None:
|
||||||
|
# 子线程下载
|
||||||
|
self.NetImages[url] = [None, 1]
|
||||||
|
print('download ', url)
|
||||||
|
Thread(target=self.downloadImage, args=(url,), daemon=True).start()
|
||||||
|
elif img:
|
||||||
|
return img
|
||||||
|
return ret
|
||||||
|
|
||||||
|
def mouseDoubleClickEvent(self, event):
|
||||||
|
# 双击图片得到图片的URL,也可以用来放大显示
|
||||||
|
super(TextBrowser, self).mouseDoubleClickEvent(event)
|
||||||
|
url = self.anchorAt(event.pos())
|
||||||
|
if url:
|
||||||
|
print('url:', url, self.document().resource(QTextDocument.ImageResource, QUrl(url)))
|
||||||
|
|
||||||
|
|
||||||
|
class Window(QWidget):
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
super(Window, self).__init__(*args, **kwargs)
|
||||||
|
layout = QVBoxLayout(self)
|
||||||
|
|
||||||
|
self.textBrowser = TextBrowser(self)
|
||||||
|
self.downButton = QPushButton('加载网络图片', self)
|
||||||
|
|
||||||
|
layout.addWidget(self.textBrowser)
|
||||||
|
layout.addWidget(self.downButton)
|
||||||
|
|
||||||
|
# 加载本地图片
|
||||||
|
img = QImage('../Donate/weixin.png')
|
||||||
|
# 第二个参数为任意唯一的url类似于qrc方式
|
||||||
|
self.textBrowser.document().addResource(QTextDocument.ImageResource, QUrl('dynamic:/images/weixin.png'), img)
|
||||||
|
|
||||||
|
# 设置html
|
||||||
|
# 需要注意里面的图片地址
|
||||||
|
self.textBrowser.setHtml(
|
||||||
|
'<p><a href="../Donate/weixin.png"><img src="../Donate/weixin.png"></a></p>' # 方式一直接加载本地图片
|
||||||
|
'<p><a href="dynamic:/images/weixin.png"><img src="dynamic:/images/weixin.png"></a></p>' # 方式二通过addResource添加资源
|
||||||
|
'<p><a href="irony://zhifubao.png"><img src="irony://zhifubao.png"></a></p>' # 方式三定义自定义的协议头通过loadResource动态加载
|
||||||
|
'<p><a href="https://blog.pyqt5.com/img/avatar.png"><img ' # 方式四类似方式三,只不过需要从网络中下载
|
||||||
|
'src="https://blog.pyqt5.com/img/avatar.png"></a></p>')
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
import sys
|
||||||
|
import cgitb
|
||||||
|
|
||||||
|
cgitb.enable(1, None, 5, '')
|
||||||
|
from PyQt5.QtWidgets import QApplication
|
||||||
|
|
||||||
|
app = QApplication(sys.argv)
|
||||||
|
w = Window()
|
||||||
|
w.show()
|
||||||
|
sys.exit(app.exec_())
|
|
@ -0,0 +1,14 @@
|
||||||
|
# QTextBrowser
|
||||||
|
|
||||||
|
- 目录
|
||||||
|
- [动态加载图片](#1动态加载图片)
|
||||||
|
|
||||||
|
## 1、动态加载图片
|
||||||
|
[运行 DynamicRes.py](DynamicRes.py)
|
||||||
|
|
||||||
|
动态加载资源有多种方式,这里主要介绍 [addResource](https://doc.qt.io/qt-5/qtextdocument.html#addResource) 和 [loadResource](https://doc.qt.io/qt-5/qtextbrowser.html#loadResource) 函数
|
||||||
|
|
||||||
|
1、通过 `self.textBrowser.document().addResource(QTextDocument.ImageResource, QUrl('dynamic:/images/weixin.png'), img)` 向文档中注册新的资源索引,类似QRC
|
||||||
|
2、通过重载 `loadResource` 函数可以监听到所有的资源加载,然后动态返回内容
|
||||||
|
|
||||||
|
![DynamicRes](ScreenShot/DynamicRes.gif)
|
BIN
QTextBrowser/ScreenShot/DynamicRes.gif
Normal file
BIN
QTextBrowser/ScreenShot/DynamicRes.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 744 KiB |
|
@ -113,6 +113,7 @@ https://pyqt.site 论坛是专门针对PyQt5学习和提升开设的网站,分
|
||||||
- [显示.9格式图片(气泡)](QLabel/NinePatch.py)
|
- [显示.9格式图片(气泡)](QLabel/NinePatch.py)
|
||||||
- [圆形图片](QLabel/CircleImage.py)
|
- [圆形图片](QLabel/CircleImage.py)
|
||||||
- [QTextBrowser](QTextBrowser)
|
- [QTextBrowser](QTextBrowser)
|
||||||
|
- [动态加载图片](QTextBrowser/DynamicRes.py)
|
||||||
- [QGraphicsView](QGraphicsView)
|
- [QGraphicsView](QGraphicsView)
|
||||||
- [绘制世界地图](QGraphicsView/WorldMap.py)
|
- [绘制世界地图](QGraphicsView/WorldMap.py)
|
||||||
- [添加QWidget](QGraphicsView/AddQWidget.py)
|
- [添加QWidget](QGraphicsView/AddQWidget.py)
|
||||||
|
|
Loading…
Reference in a new issue