| 24 | |
| 25 | |
| 26 | class TextBrowser(QTextBrowser): |
| 27 | NetImages = {} |
| 28 | |
| 29 | def __init__(self, *args, **kwargs): |
| 30 | super(TextBrowser, self).__init__(*args, **kwargs) |
| 31 | self.setOpenLinks(False) # 禁止打开URL |
| 32 | |
| 33 | def downloadImage(self, url): |
| 34 | try: |
| 35 | self.NetImages[url] = [QByteArray(requests.get(url.toString()).content), 1] |
| 36 | print('下载完成', url) |
| 37 | except Exception as e: |
| 38 | print('下载失败', url, e) |
| 39 | self.NetImages[url] = [QByteArray(), 1] |
| 40 | |
| 41 | def loadResource(self, rtype, url): |
| 42 | ret = super(TextBrowser, self).loadResource(rtype, url) |
| 43 | # 加载图片资源 |
| 44 | if rtype == QTextDocument.ImageResource: |
| 45 | if ret: |
| 46 | return ret |
| 47 | if url.toString().startswith('irony'): # 自定义的协议头 |
| 48 | print('加载本地', '../Donate/zhifubao.png', url) |
| 49 | return QImage( |
| 50 | '../Donate/zhifubao.png') # 或者 QByteArray(open('../Donate/zhifubao.png', 'rb').read()) |
| 51 | elif url.toString().startswith('http'): # 加载网络图片 |
| 52 | img, status = self.NetImages.get(url, [None, None]) |
| 53 | if url not in self.NetImages or status is None: |
| 54 | # 子线程下载 |
| 55 | self.NetImages[url] = [None, 1] |
| 56 | print('download ', url) |
| 57 | Thread(target=self.downloadImage, args=(url,), daemon=True).start() |
| 58 | elif img: |
| 59 | return img |
| 60 | return ret |
| 61 | |
| 62 | def mouseDoubleClickEvent(self, event): |
| 63 | # 双击图片得到图片的URL,也可以用来放大显示 |
| 64 | super(TextBrowser, self).mouseDoubleClickEvent(event) |
| 65 | url = self.anchorAt(event.pos()) |
| 66 | if url: |
| 67 | print('url:', url, self.document().resource(QTextDocument.ImageResource, QUrl(url))) |
| 68 | |
| 69 | |
| 70 | class Window(QWidget): |