如何解决显示来自 URL 的图像
我试图在 pyside6 中显示来自 URL 的图像,但无法正常工作。
def getIcon(data):
iconID = data['weather'][0]['icon']
icon = QPixmap("http://openweathermap.org/img/w/" + iconID + ".png");
return icon
和
self.temperatureIcon = QtWidgets.QLabel(self).setPixmap(getIcon(self.weatherData))
是我拥有的代码。
解决方法
QPixmap 不会从 url 下载图像,因此您必须下载它,例如使用 QNetworkAccessManager:
import sys
from functools import cached_property
from PySide6.QtCore import Signal,QObject,Qt,QUrl
from PySide6.QtGui import QImage,QPixmap
from PySide6.QtNetwork import QNetworkAccessManager,QNetworkReply,QNetworkRequest
from PySide6.QtWidgets import (
QApplication,QGridLayout,QLabel,QLineEdit,QPushButton,QWidget,)
class ImageDownloader(QObject):
finished = Signal(QImage)
def __init__(self,parent=None):
super().__init__(parent)
self.manager.finished.connect(self.handle_finished)
@cached_property
def manager(self):
return QNetworkAccessManager()
def start_download(self,url):
self.manager.get(QNetworkRequest(url))
def handle_finished(self,reply):
if reply.error() != QNetworkReply.NoError:
print("error: ",reply.errorString())
return
image = QImage()
image.loadFromData(reply.readAll())
self.finished.emit(image)
class Widget(QWidget):
def __init__(self,parent=None):
super().__init__(parent)
self.lineedit = QLineEdit()
self.button = QPushButton("Start")
self.label = QLabel(alignment=Qt.AlignCenter)
lay = QGridLayout(self)
lay.addWidget(self.lineedit,0)
lay.addWidget(self.button,1)
lay.addWidget(self.label,1,2)
self.downloader = ImageDownloader()
self.downloader.finished.connect(self.handle_finished)
self.button.clicked.connect(self.handle_clicked)
self.lineedit.setText("http://openweathermap.org/img/wn/01d@2x.png")
self.resize(640,480)
def handle_finished(self,image):
pixmap = QPixmap.fromImage(image)
self.label.setPixmap(pixmap)
def handle_clicked(self):
url = QUrl.fromUserInput(self.lineedit.text())
self.downloader.start_download(url)
def main():
app = QApplication(sys.argv)
w = Widget()
w.show()
sys.exit(app.exec())
if __name__ == "__main__":
main()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。