Как я могу использовать QtConcurrent :: Run и QThread?

Мой код об изображениях. Это может быть открытое изображение, изменение качества, изменение размера, отображение размера изображения … Для изменения размера и изменения качества я использую ползунок, а при изменении значений ползунков изображение снова и снова считывается из буфера. Из-за этого в моей программе происходит зависание. Итак, чтобы решить проблему, которую я хочу использовать QtConcurrent::run а также QThread или же QFuture, На самом деле я понятия не имею, как я могу их использовать, и я хотел бы помочь вам решить мою проблему.

Вот мой код Функции, которые вызывают замерзание:

void MainWindow::reprocess_image(int scale, int quality) {

rescale_image(scale);
requality_image(quality);
show_pixmap();
}void MainWindow::rescale_image(int scale) {
int w = m_image->width();
int h = m_image->height();
int new_w = (w * scale)/100;
int new_h = (h * scale)/100;

ui->lbl_width->setText(QString::number(new_w));
ui->lbl_height->setText(QString::number(new_h));

m_pixmap = QPixmap::fromImage(
m_image->scaled(new_w, new_h, Qt::KeepAspectRatio, Qt::FastTransformation));

ui->lbl_scale->setText(QString::number(scale));

}

void MainWindow::requality_image(int quality) {
QByteArray ba;
QBuffer buffer(&ba);
buffer.open(QIODevice::WriteOnly);
m_pixmap.save(&buffer, "WEBP", quality);

auto l_size_b = buffer.size();
double l_size_kb = buffer.size() / 1024.00;
ui->lbl_size->setText(QString::number(l_size_kb));

QImage image;
image.loadFromData(ba);
m_pixmap = QPixmap::fromImage(image);

ui->lbl_quality->setText(QString::number(quality));

double comp_p = 100.0 * l_size_b / m_orig_size;

if(comp_p>100) {
ui->lbl_compression->setText(QString::number(comp_p));
QLabel* m_label = ui->lbl_size;
m_label->setStyleSheet("QLabel { background-color : red; color : black; }");
}
else if(comp_p<=100) {
ui->lbl_compression->setText(QString::number(comp_p));
QLabel* m_label = ui->lbl_size;
m_label->setStyleSheet("QLabel { background-color : rgba(0,0,0,0%); color : black; }");
}
}

void MainWindow::on_sld_quality_valueChanged(int value) {
reprocess_image(ui->sld_scale->value(), value);
}

void MainWindow::on_sld_scale_valueChanged(int scale) {
reprocess_image(scale, ui->sld_quality->value());
}

И это мой mainwindow.h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QGraphicsPixmapItem>

QT_FORWARD_DECLARE_CLASS(QGraphicsScene)namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow {
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();

protected:
virtual void showEvent(QShowEvent *e) override;

private slots:
void on_openButton_clicked();
void on_sld_quality_valueChanged(int value);
void on_sld_scale_valueChanged(int value);
void on_saveButton_clicked();

private:
void reprocess_image(int scale, int quality);
void rescale_image(int);
void requality_image(int);
void show_pixmap();
void change_size();

Ui::MainWindow *ui;
QPixmap m_pixmap;
QImage  *m_image;
qint64 m_orig_size;
QGraphicsScene *m_scene;
};

#endif // MAINWINDOW_H

Как я могу интегрировать QtConcurrent::run(), QThread а также QFuture к моему коду?

-1

Решение

Весь смысл QtConcurrent::run это ты не управлять своими собственными потоками. Так что нечего интегрировать. Чтобы получить уведомление о том, когда код представлен QtConcurrent::run закончил, вы можете использовать QFutureWatcher или испустить сигнал от вызывающего.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]