Qt用线程渲染图片(UI)

class TNImageLoadThread: public QThread
{
    Q_OBJECT

public:
    explicit TNImageLoadThread(const QString &filename, const QSize &targetSize, QObject *parent = Q_NULLPTR);

signals:
    void loadFailed(const QString &filename);
    void loadFinished(const QString &filename, const QImage &bigImage);

protected:
    virtual void run();

private:
    const QString m_fileName;
    const QSize m_targetSize;
    QImage m_targetImage;

    QMutex m_mutex;
};

实现文件:

TNImageLoadThread::TNImageLoadThread(const QString &filename, const QSize &targetSize, QObject *parent) :
    QThread(parent), m_fileName(filename), m_targetSize(targetSize)
{

}

void TNImageLoadThread::run()
{
    QMutexLocker mutexLocker(&m_mutex);
    m_targetImage = QImage(m_fileName).scaled(m_targetSize);
    if (m_targetImage.isNull())
    {
        emit loadFailed(m_fileName);
    }
    else
    {
        emit loadFinished(m_fileName, m_targetImage);
    }
}

调用端代码,可以使用fileName作为ID区分不同的线程返回了指定文件的结果。

QMap<QString, QImage> m_fileNameToImage;
QMap<QString, ImageToolButton*> m_fileNameToButton;

使用信号-槽连接来更新UI控件图片:

        m_fileNameToButton[fileName] = imageButton;
        QThread *thread = new TNImageLoadThread(fileName, IconSize, this);
        connect(thread, SIGNAL(loadFinished(const QString&, const QImage&)), this, SLOT(addThumbnail(const QString&, const QImage&)));
        connect(thread, SIGNAL(loadFailed(const QString&)), this, SLOT(showError(const QString&)));
        thread->start();

槽函数实现:

void XXXX::addThumbnail(const QString &fileName, const QImage &buttonImage)
{
    if (m_fileNameToImage.contains(fileName) && m_fileNameToButton.contains(fileName))
    {
        m_fileNameToImage[fileName] = buttonImage;
        m_fileNameToButton[fileName]->setIcon(QIcon(QPixmap::fromImage(m_fileNameToImage[fileName])));
    }
}

void XXXX::showError(const QString &fileName)
{
    // 加载显示一张破图?
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值