我如何使用QtConcurrent::Run和QThread
How can I use QtConcurrent::Run and 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
集成到我的代码中?
QtConcurrent::run
的重点在于您不是管理自己的线程。所以没有积分。要获得关于提交给QtConcurrent::run
的代码何时完成的通知,您可以使用QFutureWatcher
或从可调用对象发出信号。
相关文章:
- 如何监控QThread
- 以线程安全的方式调用"QQuickPaintedItem::updateImage(const QImage&image)"(no QThread)
- join() 失败,如果在线程内部调用 io_context.run()
- 为什么我会收到"Run-Time Check Failure #2 - Stack around the variable 'pr' was corrupted"错误?
- 等待 qthread 终止的正确方法是什么?
- 如何正确停止运行非循环QThread?
- Valgrind 在 QThread::start() 上报告内存泄漏
- 如何在 QThread 中传递引用
- C++ POCO - 如何在不使用 run() 方法的情况下启动线程池上的线程?
- 使用 QTimer、QThread 和进度条
- 为什么我不能调用 QMetaObject::invokeMethod(&threadObj, &QThread::start, Qt::QueuedConnection)?
- TensorFlow c++ API 在 session->run() 上崩溃
- QThread::create 似乎没有将参数传递给函数
- 如何在QT Creator中手动运行CMake和Run
- QThread::create running on UI Thread
- 使用 QtConcurrent::run() 修改成员变量?
- 如何在QtConcurrent::run中启动QTimer或为什么QVector<QTimer*>不起作用
- std::condition_variable 在 QThread::run() 中的用法
- 在QThread::run的中间会调用一个槽
- 我如何使用QtConcurrent::Run和QThread