2

我需要将大量的 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 creator 2.7 + QT 5.0.2 关键是 QPixmap 在 Qt5+creator 的子线程中“工作”良好。但在 MS VS + Qt4.8 中,如果在子线程中使用 QPixmap,则不会显示图像。

4

1 回答 1

0

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

  1. 在 workerQObject中,在插槽(例如loadIcons())中,您准备 scaled QImages,然后发出带有类似 的签名的信号imageReady(const QImage & image, const QString & name)。当你完成加载最后一个图标时,你会发出loadingDone().

  2. 在 GUI 线程中的一个对象中,您有一个插槽,该插槽获取此图像和名称,从中创建一个图标,并将其插入到QMap按名称索引的名称中。索引的类型和使用取决于您。

当您将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();
于 2013-09-10T12:35:14.517 回答