Qt 如何在大量图像的情况下提高qscrollarea性能?

Qt 如何在大量图像的情况下提高qscrollarea性能?,qt,qscrollarea,Qt,Qscrollarea,我正在尝试使用qscrollarea实现一个文档/图像查看器。我发现qscrollarea在加载包含许多页面的文件时运行缓慢。对于一个大约有1.3k页的文档,完成加载大约需要半分钟 主要加载程序如下所示: for (int i = 0; i < DOC_COUNT; ++i) { QLabel *label = new QLabel(); label->setPixmap(IMAGE); qvboxlayout_->addWidget(label); QCore

我正在尝试使用qscrollarea实现一个文档/图像查看器。我发现qscrollarea在加载包含许多页面的文件时运行缓慢。对于一个大约有1.3k页的文档,完成加载大约需要半分钟

主要加载程序如下所示:

for (int i = 0; i < DOC_COUNT; ++i) {
  QLabel *label = new QLabel();
  label->setPixmap(IMAGE);
  qvboxlayout_->addWidget(label);
  QCoreApplication::processEvents();
}
for(int i=0;i设置像素贴图(图像);
qvboxlayout->addWidget(标签);
QCoreApplication::processEvents();
}

我知道android有一种机制,系统会自动膨胀、回收和重用视图。qt有这样的机制吗?

您的机制是典型的使用模型视图编程的情况。子类
QAbstractListModel
,并使用QListView实现您的目标。将小部件直接添加到
qscrolrea
或直接在
qscrolrea
上绘制都是内存密集型且非常糟糕的想法


这几乎正是您所需要的。

您的问题在于提前加载所有这些图像。不要那样做。按需加载。您必须定制一点
QLabel
来实现这一点,或者制作您自己的小部件。@KubaOber那么如何“按需加载它们”?你能给我看一些线索吗?你可以在标签第一次自己绘制后执行加载:监视标签何时获得重绘事件,然后只加载并设置图像。不过,您需要事先知道每个图像的大小,以便标签具有正确的大小,但没有内容。@KubaOber似乎所有QLabel都会在初始化时重新绘制自己。我尝试使用isVisible()或visibleRegion()来确定它是否在可见区域之外,但是,这两个函数总是将自身报告为可见。IIRC,它们只有在大小不正确时才会重新绘制,否则它们将不可见,也不会重新绘制。否则,请使用
qgraphicscene
并向其添加图像。