用Qt的img查看器

时间:2013-05-30 07:29:36

标签: qt qstandarditemmodel

我正在尝试基于模型/视图概念创建应用程序。 我需要打开一些目录,查找其中的所有img并在MainWindow(QMainWindow的子类)中显示它们。 架构是这样的: 1)通过QDir创建“好”文件名的QStringList(使用文件名按扩展名过滤)。 2)创建QStandardItemModel并用QStandardItem(QIcon(fileName).scaled(QSize)),fileName)填充它。 3)使用QListView显示模型中的数据。

但有一些问题。 首先 - theModel.columnCount是例如52,但屏幕上只显示一张图片而没有其名称。

有人可以帮助我: 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类的一个插槽中。

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);

1 个答案:

答案 0 :(得分: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();
}