Qt QQuickImageProvider仅加载约1%的原始图像

Qt QQuickImageProvider仅加载约1%的原始图像,qt,qtquick2,qtquickcontrols2,Qt,Qtquick2,Qtquickcontrols2,我开始学习Qt,我想用缩略图在文件夹中创建一个简单的图像列表。我设法让它工作,但它似乎随机加载只有约1图像在500和1图像在50是黑色的(截图如下)。一旦卷走缩略图,可能不会再次加载,这次可能会加载其他缩略图。对于原始图像,我使用libraw 很少观察到: 2017年7月7日-我试图检查问题是否由损坏的文件引起。虽然libraw说缩略图是jpg,但它们似乎不是,因为普通浏览器无法浏览成功或失败的尝试,但更好的编辑器可以打开相同的尝试。所以问题似乎不在于将损坏的数据提供给QImage 当我硬编码要

我开始学习Qt,我想用缩略图在文件夹中创建一个简单的图像列表。我设法让它工作,但它似乎随机加载只有约1图像在500和1图像在50是黑色的(截图如下)。一旦卷走缩略图,可能不会再次加载,这次可能会加载其他缩略图。对于原始图像,我使用libraw

很少观察到:

2017年7月7日-我试图检查问题是否由损坏的文件引起。虽然libraw说缩略图是jpg,但它们似乎不是,因为普通浏览器无法浏览成功或失败的尝试,但更好的编辑器可以打开相同的尝试。所以问题似乎不在于将损坏的数据提供给QImage

当我硬编码要加载的照片很少时,当照片较少时,它们几乎总是正确加载的。随着数量的增加,它们可能会突然变黑或根本不装载。可能是多线程问题

Libraw似乎总是正确加载文件。我测试它是通过在文件加载时在文件的中间打印足够的字节,而当它没有< /p>时。 当图像为黑色时,它认为一切正常,当图像根本不加载时,这是因为QImage有空内容

当我多次添加一个图像时,所有副本都有相同的命运(它们都加载或都失败)

对于显示图像,我使用gridview和model delegate

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 {}
}
原始图像提供程序和模型在main函数中按如下方式注册

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));
}
我真的没有办法解决这个问题,任何帮助都是。。。好有益的


这个问题很简单。Libraw的jpg缩略图实际上只是原始图像,因为jpg(我没有意识到这一点,我的不好),QtQuick无法处理它提供的图像大小。这就是为什么它在图像较少的情况下工作得很好,但在图像较多的情况下却失败了。解决方案是将调整大小的缩略图返回到更小的大小,理想情况下正好是qml中图像的大小

 return thumbnail.scaled(320, 320).scaled(160, 160, Qt::KeepAspectRatioByExpanding, Qt::SmoothTransformation);

如果你在任何地方都展示相同的图像,它会起作用吗?你能用
QWidget
显示它们吗?如果我添加一张图像,它会将每一张图像加载100倍,不会出现问题。我刚刚学会了如何使用
QtQuick
进行操作,从未尝试过
QWidget
,但我可以尝试,但这可能需要一些时间。@m7913d我使用更好的示例进行了尝试,要么全部加载,要么全部不加载。他们似乎有着同样的命运。不管我是复制项目(p1p2p2p3p3p4p4)还是复制组(p1p2p3p4p1p2p3p4),似乎都无关紧要。它的行为方式总是一样的。
 return thumbnail.scaled(320, 320).scaled(160, 160, Qt::KeepAspectRatioByExpanding, Qt::SmoothTransformation);