Qt Framework を使用して画像ギャラリー アプリケーションを開発しようとしています。アプリケーションは、選択したフォルダーからすべての画像を読み込み、それらの画像は QListView コントロールを使用して表示されます。しかし、ユーザーに表示される画像のみを読み込むことで、メモリ消費を削減したいと考えています。ビューに表示されているすべてのアイテムを直接取得する機能がないため、これを実現できません。
5 に答える
この関数を使用して、リストビューの表示アイテムを取得できますindexAt
。詳細と例については、次の記事を確認してください。
http://qt-project.org/faq/answer/how_can_i_get_hold_of_all_of_the_visible_items_in_my_qlistview
見つけた!リストウィジェットの垂直スクロールバーをシグナルに接続する必要があります:
connect(ui->listWidget->verticalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(launch_timer()));
ユーザーがスクロールするたびに、valuechanged(int) シグナルが省略されています! リストウィジェットの垂直スクロールバーの値が変更されるたびに、この質問で webclectic が提供するコードを実行しないでください。これは、プログラムが非常に多くのコードを実行すると応答しなくなるためです。
そのため、シングルショット タイマーを用意し、それを webclectic が上に投稿した関数に向ける必要があります。launch_timer() が呼び出されたら、次のようにします。
if(timer->isActive()){
timer->stop();
timer->start(300);
}
else
timer->start(300);
そして、timer の timeout() シグナルは、話題になっている webclectic のスロットに接続されます。このようにして、ユーザーがすばやく下までスクロールすると、最後の項目のみが更新されます。通常、300 ミリ秒以上表示されているものはすべて更新されます。
必要なのは、独自のモデルを実装することだと思います (QAbstractListModel のドキュメントを参照してください)。これにより、表示する画像をさらにロードする必要がある時期を決定し、非表示になった画像の一部を解放することができます。
これはそれほど単純ではありませんが、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
プライベート ヘッダーを使用しているため、後のバージョンでは機能しなくなる可能性があり、いくつかの変更が必要になります。