QThread与GUI的交互

时间:2010-10-25 09:08:38

标签: qt4 qthread

我正在开发图像采集软件。我想在一个单独的线程中运行显示功能(以确保实时视图以便于图像捕获)。现在我正在继承QObject,创建DisplayObject并使用QThread :: moveToThread函数。问题是DisplayObject必须与GUI交互(图像需要在QGraphicsView对象中显示)。这样做的最好(也是最优雅)方式是什么?

我目前的解决方案:

class DisplayObject : public QObject
{
    Q_OBJECT
    public:
        inline void addDetectorSystem(cci::PGR* system);
        inline void connectGui(ImageAquisition* gui);

    public slots:
        void display();

    private:
        cci::PGR* camSystem;
        ImageAquisition* guiClass;
};

DisplayObject初始化如下:

  DisplayObject Displayer;
        Displayer.addDetectorSystem(PGRSystem);
        Displayer.connectGui(this);
        QThread thread;
        Displayer.moveToThread(&thread);
        connect(this, SIGNAL(display()), &Displayer, SLOT(display()));
        thread.start();

我忘了承认,它不起作用......

2 个答案:

答案 0 :(得分:2)

您可以在非UI线程中使用QImage。这将允许您捕获/绘制图像。一旦准备好显示图像,您就可以用图像发出信号。您的UI元素应该有一个连接到该信号的插槽,该插槽将获取给定的图像并刷新自己以绘制该图像。

通过使用信号和插槽,数据应以线程安全的方式传输。通过在其他线程中使用QImages,您可以绘制,主UI仅负责更新创建的图像,而不是花费大量时间处理它们。

答案 1 :(得分:1)

通常,GUI是主线程,任何工作都是在后台线程中完成的 这是因为主线程需要处理鼠标,重绘,图标化事件等

关于Qt的好处是你可以在线程之间发送插槽/信号。

有关概述,请参阅threading in qt

还有一个很好的新advanced Qt book详细介绍了threadign