获取QListView中所有可见项的简单方法

时间:2012-03-22 07:48:24

标签: qt qlistview

我正在尝试使用Qt Framework开发图片库应用程序。应用程序加载所选文件夹中的所有图像,并使用QListView控件显示这些图像。 但现在我想通过仅加载用户可见的图像来减少内存消耗。由于没有直接的功能来获取视图中的所有可见项目,我无法实现这一点。

4 个答案:

答案 0 :(得分:4)

您可以使用indexAt功能获取列表视图的可见项。有关更多详细信息和示例,您可以查看以下文章:

http://qt-project.org/faq/answer/how_can_i_get_hold_of_all_of_the_visible_items_in_my_qlistview

答案 1 :(得分:1)

我找到了!您必须将listwidget的垂直滚动条连接到信号:

connect(ui->listWidget->verticalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(launch_timer()));

每次用户滚动时,都会忽略valuechanged(int)信号!问题是每次listwidget的垂直滚动条的值发生变化时,你都不应该在这个问题中运行webclectic提供的代码,因为程序将在如此短的时间内无法响应这么多代码。< / p>

所以,你必须有一个单人计时器,并指向上面发布的webclectic功能。调用launch_timer()时,您可以执行以下操作:

  if(timer->isActive()){
     timer->stop();
     timer->start(300);
   }
   else
      timer->start(300);

和计时器的超时()信号将连接到谈论的插槽音频。这样,如果用户一直快速滚动,则仅更新最后的项目。通常,它会被更新任何可见的超过300毫秒!

答案 2 :(得分:0)

我认为你需要的是实现你自己的模型(看看QAbstractListModel文档),这样你就可以决定何时需要加载更多的图像以显示并且可能释放一些变得不可见的图像

答案 3 :(得分:0)

尽管在Qt 4中不是那么简单,但是 复制到下面总是很简单:

#include <private/qlistview_p.h>

class QListViewHelper : public QListView
{
    typedef QListView super;
    inline QListViewHelper() {} //not intended to be constructed
public:
    inline static QVector<QModelIndex> indexFromRect(const QListView *view,
                                                                 const QRect &rect)
    {
        const QListViewPrivate *d = static_cast<const QListViewPrivate *>(QObjectPrivate::get(view)); //to access "QListViewPrivate::intersectingSet(...)"
        const QListViewHelper *helper = static_cast<const QListViewHelper *>(view); //to access "QListView::horizontalOffset()"
        return d->intersectingSet(rect.translated(helper->horizontalOffset(), helper->verticalOffset()), false);
    }
    inline static QVector<QModelIndex> visibleItems(const QListView *view)
        { return indexFromRect(view, view->rect()); }

    inline static QModelIndex firstVisible(const QListView *view)
        { return visibleItems(view).value(0); }
    inline static QModelIndex lastVisible(const QListView *view) {
        const QVector<QModelIndex> &items = visibleItems(view);
        return items.value(items.count() - 1);
    }
};

void ourTest(const QListView *view) {
    QModelIndex &index = QListViewHelper::firstVisible(view);
    qDebug("QListViewHelper: first visible row is %d", index.row());

    index = QListViewHelper::lastVisible(view);
    qDebug("QListViewHelper: last visible row is %d", index.row());
}

用法: QModelIndex &index = QListViewHelper::firstVisible(listViewPointerHere)

注意:由于它确实使用了 Qt 4.8 专用标头,因此它在以后的版本中可能不再起作用,并且需要进行一些更改。