我开发图像AQUISITION软件。我想在一个单独的线程(以确保轻松拍摄实时取景)上运行显示功能。现在我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();

我忘了承认,这是行不通的......

有帮助吗?

解决方案

可以在非UI线程使用QImage的。这将允许你做你的捕获/画上一个图像。一旦图像已准备好被显示,然后你可以发出与图像的信号。您的UI元素应具有连接到信号这需要给定图像和刷新本身来绘制图像的狭槽。

通过使用信号和槽,该数据应该在一个线程安全的方式传送。通过在其他线程使用QImages,你可以借鉴,主要UI仅仅是用于更新创建的图像,而不必花费大量的时间处理他们的责任。

其他提示

一般地,GUI是主线程和任何工作是在后台线程完成。结果 这是因为主线程需要处理小鼠,重绘,图标化事件等

有关Qt的好处是,可以发送线程间槽/信号。

请参阅线程在QT 一个概述。

还有新的一个好先进的Qt书覆盖threadign在细节

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top