zhiyiYo / PyQt-Fluent-Widgets

A fluent design widgets library based on C++ Qt/PyQt/PySide. Make Qt Great Again.
https://qfluentwidgets.com
GNU General Public License v3.0
5.61k stars 541 forks source link

`ImageLabel` 和 `MessageBoxBase` 组合使用的时候会产生内存泄漏 #977

Closed rainzee closed 4 weeks ago

rainzee commented 4 weeks ago

ImageLabelMessageBoxBase 组合使用的时候会产生内存泄漏,注意当使用 QDialog 时没有该问题产生

最小复现代码

import requests
from PyQt5.QtCore import QThreadPool, pyqtSignal
from PyQt5.QtGui import QPixmap
from PyQt5.QtWidgets import QApplication, QDialog, QPushButton, QVBoxLayout, QWidget
from qfluentwidgets import ImageLabel, MessageBoxBase

class ImageDialog(MessageBoxBase):
    imageDataFetched = pyqtSignal(bytes)

    def __init__(self, parent: QWidget | None = None) -> None:
        super().__init__(parent)
        # self.mainLayout = QVBoxLayout(self)
        self.posterLabel = ImageLabel(self)
        self.viewLayout.addWidget(self.posterLabel)
        self.imageDataFetched.connect(self.setImage)
        QThreadPool.globalInstance().start(self.fetchImage)

    def fetchImage(self) -> None:
        resp = requests.get("https://qfluentwidgets.com/img/features/dark-store.jpg")
        self.imageDataFetched.emit(resp.content)

    def setImage(self, imgData: bytes) -> None:
        img = QPixmap()
        img.loadFromData(imgData)
        self.posterLabel.setPixmap(img)

class View(QWidget):
    def __init__(self) -> None:
        super().__init__()
        self.resize(400, 300)
        self.mainLayout = QVBoxLayout(self)
        self.btn = QPushButton("show dialog", self)
        self.btn.clicked.connect(self.showDialog)
        self.mainLayout.addWidget(self.btn)

    def showDialog(self) -> None:
        dialog = ImageDialog(self)
        dialog.exec()

if __name__ == "__main__":
    app = QApplication([])
    view = View()
    view.show()
    app.exec()
zhiyiYo commented 4 weeks ago

已修复此问题