QCamera使用QGraphicsVideoItem输出图像

来源:互联网 发布:tomcat修改端口号 编辑:程序博客网 时间:2024/06/05 08:30

QCamera在官方文档的介绍中提到了3种输出的方式,其中两种比较常规的方式为通过widgets输出和通过QGraphicsView输出。通过widgets输出时使用的是QCameraViewfinder类,而通过QGraphicsView输出时使用的是QGraphicsVideoItem类。
官方文档中仅仅给出了使用QCameraViewfinder类的例子,并没有给出使用QGraphicsVideoItem类的例子。而在QGraphicsVideoItem类的文档中,仅仅给出了输出QMediaPlayer类的例子,而没有给出输出QCamera类的例子。因此官方文档中并没有给出使用QGraphicsVideoItem类输出QCamera类的例子。
QCamera类设置输出方式使用的函数为setViewfinder()函数,这个函数共重载为3种,分别对应3种输出的方式,使用widgets输出时的函数原型为void setViewfinder(QVideoWidget *viewfinder),而使用QGraphicsView输出时的函数原型为void setViewfinder(QGraphicsVideoItem *viewfinder)。
经过测试,文档中使用QCameraViewfinder类输出的例子是能够正常工作的:

camera = new QCamera;viewfinder = new QCameraViewfinder;camera->setViewfinder(viewfinder);viewfinder->show();camera->start();

但是使用QGraphicsVideoItem类时就无法正常工作了:

videoItem = new QGraphicsVideoItem;camera->setViewfinder(videoItem);videoItem->setSize(QSizeF(800, 600));videoItem->setPos(0, 0);scene->addItem(videoItem);camera->start();

摄像头灯会亮,但是屏幕没有出现任何图像。
在网上搜索时,发现有一些人遇到了同样的问题,但并没有人给出可靠的答案。直到我在官方论坛搜到这个页面,他似乎有相同的问题,但是最后他自己贴上去的解决方法和我遇到的问题风牛马不相及,但最后我下载了他的代码,发现他使用了QGraphicsVideoItem类进行输出,居然能够正常工作。
我对他的类进行了删改,直到删改到最小的能够正常工作的代码,其中最重要的部分是这样的:

MainWindow::MainWindow(QWidget *parent)    : QMainWindow(parent){    scene = new QGraphicsScene(0, 0, 800, 600);    view = new QGraphicsView;    view->setScene(scene);    setCentralWidget(view);    camera = new QCamera(QCameraInfo::defaultCamera(), this);    videoItem = new QGraphicsVideoItem;    camera->setViewfinder(videoItem);    videoItem->setSize(QSizeF(800, 600));    videoItem->setPos(0, 0);    scene->addItem(videoItem);}void MainWindow::keyPressEvent(QKeyEvent *event){    camera->setCaptureMode(QCamera::CaptureVideo);    camera->start();}

和我一开始给出的代码仅有微小的不同:camera->start()的调用没有直接放在构造函数,而是放在了一个事件处理函数中,按下任意键就可以调用这个函数。这样,摄像头就能够正常工作了。
如果把scene->addItem(videoItem)放到也放到这个函数中,摄像头就又不能输出了。如果保持这个语句放在构造函数,然后手动调用事件处理函数,摄像头同样不能输出,总之到最后并没有找到问题的原因。
(关于官方文档中给出的QMediaPlayer输出到QGraphicsVideoItem类的例子,也不能正常工作,但是如果设置了QGraphicsVideoItem类实例的位置和大小,则可以正常工作,并不需要将player->play()调用放到一个额外事件处理函数中)

0 0
原创粉丝点击