gpt4 book ai didi

c++ - 如何使用线程创建图像缩略图

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:02:07 25 4
gpt4 key购买 nike

我使用 QTreeView 获取图像路径,然后我使用 QListView 将特定路径中的图像显示为缩略图。

期间的问题,创建并显示缩略图。
前面的过程,需要很长时间才能完成,取决于图像的数量。
出于这个原因,我决定使用线程,也许有助于防止应用程序中发生的挂起并提高创建和显示缩略图的速度。

void mainWidget::on_treeView_clicked(const QModelIndex &index){
filesModel->clear();
QFileSystemModel *sysModel = qobject_cast<QFileSystemModel*>(ui->treeView->model());
QDir dir(sysModel->filePath(ui->treeView->currentIndex()));
QFileInfoList filesList = dir.entryInfoList(QStringList() << "*.jpg" << "*.jpeg" << "*.tif" << "*.png" << "*.gif" << "*.bmp" ,QDir::Files);
int filesCount = filesList.size();
for(int i=0;i<filesCount;i++){
QPixmap originalImage(filesList[i].filePath());
if(!originalImage.isNull()){
QPixmap scaledImage = originalImage.scaled(150, 120);
filesModel->setItem(i, new QStandardItem(QIcon(scaledImage), filesList[i].baseName()));
}
}
}

如何将线程与之前的代码一起使用?

最佳答案

我相信一个简单而正确的方法是使用 QtConcurrent如下所示:

注意:如果您使用的是 Qt 5,则需要将 QT += concurrent 添加到 .pro 文件中。

标题:

#include <QtCore>
#include <QtGui>
#include <QtWidgets>
#include <QtConcurrent>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
Q_OBJECT

public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();

signals:
void UpdateItem(int, QImage);

private slots:
void on_treeView_clicked(const QModelIndex &);
void List(QFileInfoList filesList, QSize size);
void setThumbs(int index, QImage img);

private:
Ui::MainWindow *ui;
QFileSystemModel *model;
QStandardItemModel *filesmodel;
QFuture<void> thread;
bool running;
};

CPP 文件:

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);

QThreadPool::globalInstance()->setMaxThreadCount(1);

model = new QFileSystemModel(this);
model->setRootPath("\\");

filesmodel = new QStandardItemModel(this);

ui->treeView->setModel(model);
ui->listView->setModel(filesmodel);

connect(this, SIGNAL(UpdateItem(int,QImage)), SLOT(setThumbs(int,QImage)));

ui->treeView->header()->setSectionResizeMode(QHeaderView::ResizeToContents);

running = false;
}

MainWindow::~MainWindow()
{
delete ui;
}

void MainWindow::on_treeView_clicked(const QModelIndex&)
{
filesmodel->clear();

running = false;

thread.waitForFinished();

QDir dir(model->filePath(ui->treeView->currentIndex()));

QFileInfoList filesList = dir.entryInfoList(QStringList() << "*.jpg" << "*.jpeg" << "*.tif" << "*.png" << "*.gif" << "*.bmp", QDir::Files);

int filesCount = filesList.size();

QPixmap placeholder = QPixmap(ui->listView->iconSize());
placeholder.fill(Qt::gray);

for (int i = 0; i < filesCount; i++)
filesmodel->setItem(i, new QStandardItem(QIcon(placeholder), filesList[i].baseName()));

running = true;

thread = QtConcurrent::run(this, &MainWindow::List, filesList, ui->listView->iconSize());
}

void MainWindow::List(QFileInfoList filesList, QSize size)
{
int filesCount = filesList.size();

for (int i = 0; running && i < filesCount; i++)
{
QImage originalImage(filesList[i].filePath());
if (!originalImage.isNull())
{
QImage scaledImage = originalImage.scaled(size);
if (!running) return;
emit UpdateItem(i, scaledImage);
}
}
}

void MainWindow::setThumbs(int index, QImage img)
{
QIcon icon = QIcon(QPixmap::fromImage(img));
QStandardItem *item = filesmodel->item(index);
filesmodel->setItem(index, new QStandardItem(icon, item->text()));
}

关于c++ - 如何使用线程创建图像缩略图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26829754/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com