C++ Qt:必须调用对非静态成员函数的引用
我是Qt新手,今天我一直在尝试调整我的应用程序,使之能够与C++ Qt:必须调用对非静态成员函数的引用,c++,multithreading,qt,C++,Multithreading,Qt,我是Qt新手,今天我一直在尝试调整我的应用程序,使之能够与QFuture一起工作,以便在主线程之外同时运行一些任务 我有一种方法,可以更改QImage的饱和度值,该方法返回要绘制到我的QGraphicsView的QPixmap对象。这一切都很好,不使用线程,但很明显,它在主线程上非常密集,所以我想把它移开 我读了几篇关于Qt中线程的文章,发现v5支持a,这听起来非常适合我的用例,因为我认为我可以将函数分派到一个新线程上,如下面的代码片段所示: void MainWindow::on_slideS
QFuture
一起工作,以便在主线程之外同时运行一些任务
我有一种方法,可以更改QImage
的饱和度值,该方法返回要绘制到我的QGraphicsView
的QPixmap
对象。这一切都很好,不使用线程,但很明显,它在主线程上非常密集,所以我想把它移开
我读了几篇关于Qt中线程的文章,发现v5支持a,这听起来非常适合我的用例,因为我认为我可以将函数分派到一个新线程上,如下面的代码片段所示:
void MainWindow::on_slideSaturation_valueChanged(int value)
{
QFuture<QPixmap> future = QtConcurrent::run(slider->modifySaturation, value, image);
future.waitForFinished();
image = future.result();
renderImageToCanvas();
modified = true;
}
您应该调用
QtConcurrent::run
这样:
QFuture<QPixmap> future = QtConcurrent::run(slider,
&Sliders::modifySaturation,
value, image);
QFuture future=QtConcurrent::run(滑块,
&滑块::修改饱和度,
价值、形象);
但我认为你用错了。您在\u slideSaturation\u valueChanged上的
(我假设在主线程中执行)插槽将被阻止,直到future.waitForFinished()
返回。谢谢Hank,有什么建议可以改进吗?正如我所说,我对Qt是新手,发现整个体验既有趣又令人困惑!谢谢。@Alex在您的场景中,我将使用一个worker对象,它在完成任务时发出信号。使用将此辅助对象移动到新线程。使用该信号将QImage
对象发送到主线程。然后使用这个QImage
对象来更新你的GUI。谢谢你,thuga,我将进行更多的文档阅读,并再次尝试使用信号和slots@Alex文档中有一个很好的worker对象示例。在主线程之外的其他线程中使用QPixmap
是不安全的。请改用QImage
。您能为我的应用程序提供更好的结构化方法吗?
QFuture<QPixmap> future = QtConcurrent::run(slider,
&Sliders::modifySaturation,
value, image);