c++ - Qt更新显示的QImage

标签 c++ linux qt

我使用一个 SDK 从相机获取图像,该 SDK 以 unsigned char 数组形式返回数据。但是这个 SDK 不提供显示数据的功能,所以我尝试在 Ubuntu 12.04 下使用 Qt 4.8 来实现它。

目前我的代码是这样的:

#include <QtGui/QApplication>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QGraphicsPixmapItem>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QGraphicsScene scene;
    QGraphicsView view(&scene);

    while (..) // condition which breaks after a number of images where grabbed
    {
        // Get the image from the third party SDK into an unsigned char array
        // named pImageBuffer

        QImage image ((unsigned char *) pImageBuffer, 
            GetWidth(), 
            GetHeight(), 
            QImage::Format_Indexed8);

        QVector<QRgb> colorTable(256);
        for(int i=0;i<256;i++)
            colorTable[i] = qRgb(i,i,i);
        image.setColorTable(colorTable);

        QPixmap pixmap = QPixmap::fromImage(image);
        QGraphicsPixmapItem *item = new QGraphicsPixmapItem(pixmap);
        scene.addItem(item);

        view.show();
        a.exec();
    }
}

这按预期工作,图像显示正确。但是 a.exec() 会阻塞主线程,直到我关闭 QtWindow。

有什么简单的方法可以修改它,让窗口一直保持打开状态,只更新显示的图像吗?目前性能根本不重要,但我需要保持代码简单。

最佳答案

虽然调用 QApplication::processEvents 会起作用,但这只是一种 hack 而不是最佳解决方案。

理想情况下,图像采集器应该作为从 QObect 派生的对象在单独的线程上运行。该对象发出它接收到的图像的信号,这些信号由主线程上的对象接收。

然后接收对象可以在 QGraphicsPixmapItem 对象上设置图像。

请注意,问题中的代码会为从抓取器接收到的每个图像创建一个新的 QGraphicsPixmapItem。假设您想要创建一个动画图像,您应该只创建一个 QGraphicsPixmapItem 并将其添加到场景中。

使用 QThread 非常简单,如果您以前没有用过,我建议您 read this article ,它通过示例代码清楚地解释了要做什么。

关于c++ - Qt更新显示的QImage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21335407/

相关文章:

c++ - 程序终止于大数组的初始化

c++ - 常量变量的存储分配

linux - *nix 中的等效 win API

linux - 将信息从我的程序传递到调用脚本(退出时)的正确方法是什么

c++ - 十六进制到字符串转换 C++/C/Qt?

c++ - windows.h 的 Beep() 的更快替代品

c++ - 在 C++ 中,指针是否保证在 `delete` 之后保留其值?

php - 我如何让 SublimeCodeIntel 跳转到适用于 php 的符号

qt - 在Qt中注册用户定义的类需要什么?

c++ - 在 C++ 中获取应用程序窗口的大小