2017-07-06 8 views
0

私はQtを学び始めました。サムネイル付きのフォルダに画像の簡単なリストを作りたいと思っていました。私はそれを動作させることができましたが、500で1画像だけをランダムにロードし、50で1画像を黒で表示します(下のスクリーンショット)。一旦スクロールすると、サムネイルは再び読み込まれず、他のものがこの時間に読み込まれる可能性があります。生の画像については、私はlibrawを使用します。QQuickImageProviderは生画像の約1%しか読み込みません

少数の観測:

2017年7月7日 - 私は、問題が壊れたファイルによって引き起こされていなかったかどうかをチェックしてみました。 librawはサムネイルがjpgであると言っていますが、通常のブラウザではブラウザーが正常に実行されず、失敗したアテンプもブラウザーで表示できないため、サムネイルは表示されません。だから、問題はQImageに与えられたデータの破損ではないようです。

ロードする写真がハードコーディングされたとき、写真が少なくなるとほぼ常に正しくロードされました。金額が増えると、突然すべてが黒くなったり、まったく読み込まれなくなったりする可能性があります。たぶんマルチスレッドの問題?

Librawは常にファイルを正しく読み込むようです。ファイルの途中に十分なバイト数を印字してテストしました。

画像が黒いと、画像が全く読み込まれない場合はすべて問題ないと思いますQImageにはコンテンツがありません。

私は1つの画像を何度も追加すると、すべてのコピーが(彼らはすべての負荷またはそれらはすべて失敗)同じ運命を共有

QImage RawImageProvider::requestImage(const QString &id, QSize *size, const QSize &requestedSize) { 
LibRaw rawProc; 
auto state = rawProc.open_file(id.toLatin1().data()); 
QImage thumbnail; 
if(LIBRAW_SUCCESS == state) { 
    if(LIBRAW_SUCCESS == rawProc.unpack_thumb()) { 
     if (LIBRAW_THUMBNAIL_JPEG == rawProc.imgdata.thumbnail.tformat) { 
      thumbnail.loadFromData((unsigned char*)rawProc.imgdata.thumbnail.thumb, rawProc.imgdata.thumbnail.tlength, "JPEG"); 
     } 
    } 
    rawProc.recycle(); 
} 
return thumbnail; 
} 

私はGridViewコントロールとモデルデリゲート

を使用した画像を表示します
GridView { 
    id: gridView 
    anchors.rightMargin: 6 
    anchors.leftMargin: 6 
    anchors.bottomMargin: 6 
    anchors.topMargin: 46 
    anchors.fill: parent 
    cellHeight: 200 
    cellWidth: 185 
    model: imageModel 
    delegate: PhotoDelegate {} 
} 

原画像プロバイダとモデルがメイン機能では、このような登録され

int main(int argc, char *argv[]) 
{ 
... 
QQmlApplicationEngine engine; 
engine.addImageProvider(QLatin1String("rawProvider"), new RawImageProvider); 

AppData::setContext(engine.rootContext()); 
AppData::notifyContext(); 
... 
} 

AppDataは、モデルが作成されたリストとコンテキストへのポインタを保持する私の "静的"クラスで、qml(ファイルブラウザ)から呼び出される他のクラスからこれらの値に簡単にアクセスして更新できます。モデルの更新は、データが変更されるたびに実行されます。

void AppData::notifyContext() { 
    context->setContextProperty("imageModel", QVariant::fromValue(dataList)); 
} 

私は本当に、私はこの問題を解決できる方法のアイデアを使い果たしているすべてのヘルプは次のようになります...よく...便利

this is how it looks

+0

どこでも同じ画像を表示すると機能しますか? 'QWidget'を使ってそれらを表示できますか? – m7913d

+0

1つのイメージを複数回(100回)追加すると、問題なく1つ1つイメージが読み込まれます。私はちょうど 'QtQuick'で' QWidget'を試したことがないようにする方法を学んだけど、試してみることができます。おそらく時間がかかります。 – adsamcik

+0

@ m7913dもっと良いサンプルで試してみました。彼らは同じ運命を共有しているようだ。それは、アイテム(p1 p1 p2 p2 p3 p3 p4 p4)またはグループ(p1 p2 p3 p4 p1 p2 p3 p4)を複製するかどうかは、常に同じように動作するかどうかは関係ありません。 – adsamcik

答えて

1

問題は非常に簡単でした。 Librawのjpgサムネイルは実際にjpg(私はこれを認識していない、私の悪い)としてのオリジナルイメージであり、QtQuickは提供されたイメージのサイズを処理できませんでした。だからこそ、より少ない画像でうまく動きましたが、より多くの画像でひどく失敗しました。その解決策はサムネイルのサイズを小さくして、理想的にはqmlのイメージのサイズに戻しました。

return thumbnail.scaled(320, 320).scaled(160, 160, Qt::KeepAspectRatioByExpanding, Qt::SmoothTransformation); 
関連する問題