在子线程中缩放QIcon

时间:2013-05-30 16:04:05

标签: qt qimage qpixmap qicon

我需要将大量的imgs加载到QIcons中(所有工作都用子线程来统治)。 如果我写:QIcon(filename) - 它将加载所有文件。加载150或200个文件后,没有空闲的RAM。 起初我尝试使用QImage并对其进行缩放:QImage(fileName).scaled(QSize(w, h)) - 它可以保护大量内存。但问题是在没有QPixmap的情况下将QImage放入QIcon,因为QPixmap不能在主线程之外使用(有时可以使用,但它不安全)。

PS 我尝试同时在两个“平台”上测试我的应用程序 - MS VS 2005 + QT 4.8.2和QT创建者2.7 + QT 5.0.2 关键是QPixmap在Qt5 +创建者的子线程中“工作”很好。但是在MS VS + Qt4.8中,如果在子线程中使用QPixmap,则不会显示图像。

1 个答案:

答案 0 :(得分:0)

您需要在worker和GUI线程之间拆分工作。

  1. 在工作人员QObject中,在插槽(例如loadIcons())中,您准备缩放QImage,然后发出带有imageReady(const QImage & image, const QString & name)签名的信号。加载完最后一个图标后,您会发出loadingDone()

  2. 在一个位于GUI线程中的对象中,您有一个插槽,可以获取此图像和名称,从中创建一个图标,然后将其插入到按名称索引的QMap中。指数的类型和用途取决于你。

  3. 当您将imageReady信号连接到GUI线程中对象的插槽时,连接将排队,事情应该合理:

    QThread * thread = new QThread;
    Worker * worker = new Worker; // worker object
    worker->moveToThread(thread);
    connect(thread, SIGNAL(started()), worker, SLOT(loadIcons());
    connect(worker, SIGNAL(loadingDone()), thread, SLOT(quit());
    connect(thread, SIGNAL(finished()), worker, SLOT(deleteLater());
    connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater());
    connect(worker, SIGNAL(imageReady(QImage,QString)), guiObject, SLOT(makeIcon(QImage,QString)));
    thread->start();