0

モデル/ビューの概念に基づいてアプリケーションを作成しようとしています。いくつかのディレクトリを開き、その中のすべての imgs を見つけて、それらを MainWindow (QMainWindow のサブクラス) に表示する必要があります。アーキテクチャは次のようなものです: 1) QDir を介して、「適切な」ファイル名の QStringList を作成します (拡張子によるファイル名フィルターを使用)。2) QStandardItemModel を作成し、QStandardItem (QIcon(QImage(fileName).scaled(QSize)), fileName) で埋めます。3) QListView を使用して、モデルからのデータを表示します。

しかし、いくつかの問題があります。まず最初に - theModel.columnCount はたとえば 52 ですが、画面には 1 つの画像しか表示されず、その名前は表示されません。

誰かが私を助けることができますか: 1) モデルを正しく埋める方法は? 私のアプローチ:

QDir dirs(dir);
QStringList imgs = dirs.entryList(QStringList() << "*.jpg" << "*.jpeg" << "*.bmp" << "*.png");

itemModel->clear();

QList<QStandardItem *> listItem;
for(int i = 0; i < imgs.count(); ++i){
    QImage image = QImage(dir + "/" + imgs.at(i)).scaled(QSize(size().width()/4, size().height()/4));

    QStandardItem *item = new QStandardItem();
    item->setIcon(QIcon(QPixmap::fromImage(image)));
    item->setData(imgs.at(i));
    listItem << item;
}
itemModel->appendRow(listItem);

このコードは MainWindow クラスの 1 つのスロットにあります。

2)私が理解しているように、ビューは自動的に更新されるため、モデルのすべてのデータが表示されるはずです。私は正しいですか、それともいくつかのコードが必要ですか?

3)モデルとビューの初期化で何かをしていない可能性があります(コードはMainWindowクラスのコンストラクターにあります):

    itemModel = new QStandardItemModel(this);

    listView = new QListView(this);
    listView->setModel(itemModel);
//    listView->setFlow(QListView::LeftToRight);
//    listView->setLayoutMode(QListView::Batched);
    listView->setViewMode(QListView::IconMode);
    listView->setResizeMode(QListView::Adjust);
//    listView->setGridSize(QSize(size().width()/4, size().height()/4));
    listView->setIconSize(QSize(size().width()/4, size().height()/4));

    setCentralWidget(listView);
4

1 に答える 1

0

最後のビットが必要であると判断したのでappendColumn、QIcon をデータとしてQt::DecorationRole. 以下は、プログラムが実行されているのと同じフォルダー内の画像を表示するために機能します (ただし、グリッド レイアウトで表示される理由はわかりません)。

#include <QApplication>
#include <QStandardItemModel>
#include <QListView>
#include <QDir>
#include <QStringList>
#include <QList>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QStandardItemModel* itemModel = new QStandardItemModel();
    QListView* listView = new QListView();

    QDir dirs(".");
    QStringList imgs = dirs.entryList(QStringList() << "*.jpg" << "*.jpeg" << "*.bmp" << "*.png");

    QList<QStandardItem *> listItem;
    for(int i = 0; i < imgs.count(); ++i){
        QImage image = QImage(dirs.absoluteFilePath(imgs.at(i))).scaled(QSize(80, 60));

        QStandardItem *item = new QStandardItem();
        item->setData(QVariant(QPixmap::fromImage(image)), Qt::DecorationRole);
        listItem << item;
    }

    itemModel->appendColumn(listItem);

    listView->setModel(itemModel);
    listView->setViewMode(QListView::IconMode);

    listView->show();

    a.exec();
}
于 2014-01-24T23:36:55.460 に答える