我需要将大量的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,则不会显示图像。
答案 0 :(得分:0)
您需要在worker和GUI线程之间拆分工作。
在工作人员QObject
中,在插槽(例如loadIcons()
)中,您准备缩放QImage
,然后发出带有imageReady(const QImage & image, const QString & name)
签名的信号。加载完最后一个图标后,您会发出loadingDone()
。
在一个位于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();