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()调用放到一个额外事件处理函数中)