0

我正在开发图像采集软件。我想在单独的线程中运行显示功能(以确保实时取景以便于图像捕获)。现在我正在继承 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();

我忘了承认,这行不通……

4

2 回答 2

2

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

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

于 2010-10-26T15:37:54.207 回答
1

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

Qt 的好处是您可以在线程之间发送槽/信号。

有关概述,请参阅qt 中的线程。

还有一本很好的新的高级 Qt 书,详细介绍了 threadign

于 2010-10-25T13:59:01.050 回答