2013-05-30 2 views
2

Мне нужно загрузить большое количество imgs в QIcons (все работы управляются дочерним потоком). если я пишу: QIcon(filename) - он загрузит весь файл. и после загрузки 150 или 200 файлов нет свободной ОЗУ. Сначала я попытался использовать QImage и масштабировал его: QImage(fileName).scaled(QSize(w, h)) - он позволяет безопасно хранить много памяти. но проблема заключается в том, чтобы поставить QImage в QIcon без QPixmap, потому что QPixmap нельзя использовать вне основного потока (иногда его можно использовать, но он небезопасен).scaled QIcon в дочерней цепочке

PS я пытаюсь проверить мое приложение на двух "платформ" одновременно - MS VS 2005 + QT 4.8.2 и Qt Creator 2.7 + QT 5.0.2 точка является QPixmap "работает" хорошо в детской теме в Qt5 + создатель. но в MS VS + Qt4.8 изображения не отображаются, если QPixmap используется в дочернем потоке.

+0

Не могли бы вы сделать масштабирование на основная тема? Если проблема связана с пользовательским интерфейсом, вы можете вызвать «processEvents» где-нибудь в вашем цикле загрузки изображений. –

ответ

0

Необходимо разделить работу между потоками рабочего и графического интерфейса.

  1. В работника QObject, в слот (скажем loadIcons()) вы готовитесь масштабируется QImage сек, а затем излучают сигнал с подписью, как imageReady(const QImage & image, const QString & name). Когда вы закончите загрузку последнего значка, вы испускаете loadingDone().

  2. В объекте, который живет в потоке графического интерфейса пользователя, у вас есть слот, который принимает это изображение и имя, создает из него значок и вставляет его в строку 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(); 
Смежные вопросы