3

こんにちは。質問があります。QTableWidgetディレクトリから画像を配置し、選択したセルにある画像の名前を取得する必要がある場所があります。ディレクトリ内のファイル数に応じて、行数と列数を自動的に生成するにはどうすればよいですか? 手でテーブルに画像を追加することはできますが、やりたいことではありません。私はそれが何かに違いないと思います

QDir dir("images/");
QFileInfoList dirContent = dir.entryInfoList(QStringList()<< "*.png", QDir::Files | 
QDir::NoDotAndDotDot);

しかし、どうすればこれを行うことができるのか、まだわかりません。

4

2 に答える 2

3

2 つのアプローチがあります。

非再帰的

main.cpp

#include <QDir>
#include <QFileInfo>
#include <QTableWidget>
#include <QPixmap>
#include <QApplication>

int main(int argc, char **argv)
{
    QApplication application(argc, argv);
    QTableWidget tableWidget(100, 5);
    QDir dir("images/");
    for (const auto& fileInfo : dir.entryInfoList(QStringList{"*.png"}, QDir::Files | QDir::NoDotAndDotDot))
    {
        static int row = 0, column = 0;
        QTableWidgetItem *newItem = new QTableWidgetItem(QObject::tr("%1").arg((row+1)*(column+1)));
        newItem->setData(Qt::DecorationRole, QPixmap(fileInfo.absoluteFilePath()));
        tableWidget.setItem(row, column, newItem);
        if (column == tableWidget.columnCount()) {
            column = 0;
            row++;
        }
    }
    tableWidget.show();
    return application.exec();
}

main.pro

TEMPLATE = app
TARGET = main
QT += widgets
CONFIG += c++11
SOURCES += main.cpp

ビルドして実行

qmake && make && ./main

再帰的

main.cpp

#include <QDir>
#include <QDirIterator>
#include <QFileInfo>
#include <QTableWidget>
#include <QPixmap>
#include <QApplication>

int main(int argc, char **argv)
{
    QApplication application(argc, argv);
    QTableWidget tableWidget(100, 5);
    QDir dir("images/");
    dir.setFilter(QDir::NoDotAndDotDot| QDir::Files);
    QDirIterator it(dir, QDirIterator::Subdirectories);
    while (it.hasNext()) {
        static int row = 0, column = 0;
        it.next();
        QFileInfo Info = it.fileInfo();
        QString path = Info.absolutePath();
        if(Info.isFile() && path.endsWith(".png")) {
            QTableWidgetItem *newItem = new QTableWidgetItem(QObject::tr("%1").arg((row+1)*(column+1)));
            newItem->setData(Qt::DecorationRole, QPixmap(path));
            tableWidget.setItem(row, column, newItem);
            if (column == tableWidget.columnCount()) {
                column = 0;
                row++;
            }
        }
    }
    tableWidget.show();
    return application.exec();
}

main.pro

TEMPLATE = app
TARGET = main
QT += widgets
CONFIG += c++11
SOURCES += main.cpp

ビルドして実行

qmake && make && ./main
于 2014-12-16T17:37:16.930 に答える
2

QFileInfoListは単なる であるQList<QFileInfo>ため、このリストのサイズを簡単に取得できます。次のようなものを使用します。

QDir dir("G:/2");
QFileInfoList dirContent = dir.entryInfoList(QStringList()<< "*.png", QDir::Files |
QDir::NoDotAndDotDot);

ui->tableWidget->setColumnCount(1);
ui->tableWidget->setRowCount(dirContent.size());

for(int i=0; i < dirContent.size(); i++)
{
    qDebug() << dirContent.at(i).absoluteFilePath();
    ui->tableWidget->item(i,0)->setData(Qt::DecorationRole, QPixmap(dirContent.at(i).absoluteFilePath()));
}

また、方法で画像をスケーリングしてscale()使用することもできます:

ui->tableWidget->resizeRowsToContents();
于 2014-12-16T16:29:36.107 に答える