2

大量の imgs を QIcons にロードする必要があります (すべての作業は子スレッドで制御されます)。私が書いた場合:QIcon(filename)- すべてのファイルをロードします。150 または 200 個のファイルがロードされると、空き RAM がなくなります。最初に QImage を使用してスケーリングしようとしました: QImage(fileName).scaled(QSize(w, h))- 大量のメモリを安全に使用できます。しかし問題は、QPixmap なしで QImage を QIcon に入れることです。なぜなら、QPixmap はメインスレッドの外では使用できないからです (使用できる場合もありますが、安全ではありません)。

PS 2 つの「プラットフォーム」でアプリケーションを同時にテストしようとしています - 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()) では、スケーリングされQImageた s を準備してから、 のようなシグネチャでシグナルを送信しimageReady(const QImage & image, const QString & name)ます。最後のアイコンの読み込みが完了すると、loadingDone().

  2. QMapGUIスレッドに存在するオブジェクトには、この画像と名前を取得し、そこからアイコンを作成し、名前でインデックス付けされたものに挿入するスロットがあります。インデックスのタイプと使用はあなた次第です。

imageReadyGUI スレッドにあるオブジェクトのスロットにシグナルを接続すると、接続がキューに入れられ、適切に動作するはずです。

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 に答える