在QT中通过摄像头动态显示图片

在QT中通过摄像头动态显示图片

Camgui::Camgui(QWidget  * parent,  const   char   * name,  int  wFlags):QWidget(parent, name, wFlags)
{
    
//之前的代码略
    
//创建一个QTimer的对象进行计时,间隔刷新窗体
    
//在这里使用update()
    
//与repaint比起来,这个SLOT可以避免闪屏
    timer = new QTimer(this);
    connect(timer, SIGNAL(timeout()), SLOT(update()));
    timer
->start(30);
}


void  Camgui::paintEvent(QPaintEvent  * e)
{
    
int x, y;
    
int i = 0;
    QRgb 
*point;
    
int r, g, b;

    
//创建该PaintEvent的操作对象paint
        //该对象为静态对象,不需要每次paint都创建一个QPainter
    static QPainter paint(this);

    
//该步很重要,设置标志
    
//让QWidget在更新窗体时,不擦除原来的窗体
    
//这样可以避免闪屏
    setWFlags(getWFlags() | Qt::WRepaintNoErase);

    
//从摄像头获取图像信息到img指向的内存空间
    img = get_image(dev, width, height, palette, &size);

    
//读取内存内容,创建QImage对象
    image = new QImage;
    
if(image->create(width, height, 320, QImage::IgnoreEndian))
    
{
        
for(x = 0; x < height; x++)
        
{
            
for(y = 0; y < width; y++)
            
{
                r 
= (int)img[i+2];
                g 
= (int)img[i+1];
                b 
= (int)img[i];
                point 
= (QRgb *)image->scanLine(x)+y;
                
*point = qRgb(r, g, b);
                i 
+= 3;
            }

        }

    }


    
//开始绘图
    paint.begin(this);
    paint.
drawImage(00*image);
    paint.
end();

    
//释放空间
    if(size)
    
{
        munmap(img, size);
    }

    
else if(img)
    
{
        free(img);
    }

    delete image;
    image 
= NULL;
}

你可能感兴趣的:(timer,image,null,qt,Signal)