2014-10-28 392 views
0

我是Qt中的新手,今天我一直在尝试使我的应用程序适应QFuture,以便在主线程中同时运行一些任务。Qt:必须调用对非静态成员函数的引用

我有一种方法,它可以改变QImage的饱和度值,该值返回一个QPixmap对象以便绘制到我的QGraphicsView。这一切都运行良好,没有使用线程,但显然它在主线程上非常密集,所以我想把它移走。

我看了Qt的有关线程几篇文章,发现V5支持concurrent run functionality,这听起来非常适合我的使用情况下,我想我只能够派遣我的功能集成到一个新的线程,如下面的代码片段:

void MainWindow::on_slideSaturation_valueChanged(int value) 
{ 
    QFuture<QPixmap> future = QtConcurrent::run(slider->modifySaturation, value, image); 
    future.waitForFinished(); 
    image = future.result(); 
    renderImageToCanvas(); 
    modified = true; 
} 

但是,我收到错误reference to non-static member function must be called。 这个错误是从我的Sliders类中调用的,我知道我没有将该方法声明为静态方法,但是当我这样做时会导致整个堆错误 - 是否有任何方法可以将此方法传递给没有它的并发调用被宣布为静态?

Sliders.h

class Sliders 
{  
public: 
    Sliders(); 

    enum Member { RED, GREEN, BLUE, BRIGHTNESS, CONTRAST, HUE, SATURATION, LIGHTNESS }; 

    QPixmap modifySaturation(int, QPixmap); 
    void setMember(enum Member, int); 
    int getMember(enum Member); 

private: 
    int m_redValue; 
    int m_greenValue; 
    int m_blueValue; 
    int m_brightnessValue; 
    int m_contrastValue; 
    int m_hueValue; 
    int m_saturationValue; 
    int m_lightnessValue; 
}; 
+1

在主线程中使用'QPixmap'不安全。改为使用'QImage'。 – thuga 2014-10-28 14:22:42

+0

你能否提出一个更好的方式来构建我的应用程序? – Alex 2014-10-28 14:27:47

回答

1

你应该叫QtConcurrent::run这样的:

QFuture<QPixmap> future = QtConcurrent::run(slider, 
              &Sliders::modifySaturation, 
              value, image); 

但我认为你正在使用它错了反正。您假设在主线程中执行的on_slideSaturation_valueChanged插槽将被阻止,直到future.waitForFinished()返回。

+0

感谢汉克,关于如何改进这一点的任何建议?正如我所说我是Qt新手,发现整个体验既有趣又令人困惑!谢谢。 – Alex 2014-10-28 13:24:49

+2

@Alex在您的场景中,我将使用完成任务时发出信号的工作对象。使用['QObject :: moveToThread'](http://qt-project.org/doc/qt-5/qobject.html#moveToThread)将此工作对象移动到新线程。使用该信号将'QImage'对象发送到主线程。然后使用这个'QImage'对象来更新你的GUI。 – thuga 2014-10-28 14:27:58

+0

谢谢你thuga,我会做更多的doc阅读,并有另一个使用信号和插槽 – Alex 2014-10-28 14:28:43

相关问题