在Qt控制台应用程序中使用QCamera

时间:2014-08-27 08:41:19

标签: qt qtmultimedia

我想在无头(控制台)qt应用程序中使用相机(至少用于单元测试)。

但是我遇到了Qt的问题。一旦我在控制台应用程序中使用我的代码,相机就无法工作 - readyForCaptureChanged QCameraImageCapture事件将不会被调用。

如果我在gui应用程序中使用完全相同的代码,则会触发事件并且我可以捕获图像。

我使用的常用代码是:

    camera = new QCamera(cameras.at(config->cameraNumber()));

    imageCapture = new QCameraImageCapture(camera);
    connect(imageCapture, SIGNAL(readyForCaptureChanged(bool)), this, SLOT(readyForCapture(bool)));

    camera->start(); // to start the viewfinder

// ——
void ImageCapture::readyForCapture(bool b) {
    qDebug() << "ready for capture "<<b;
}
  • 当我直接在我的MainWindow的构造函数中在gui应用程序中调用此代码时,它可以工作(事件将被触发)。
  • 当我在qt控制台应用程序中调用此代码时,它不起作用(不会触发事件)。

任何人都可以帮助我吗?感谢

**更新29.八月 - 完整代码**

控制台应用程序:

的main.cpp

#include <QCoreApplication>
#include <QTest>
#include <QTimer>
#include <QDebug>

#include <runoneventloop.h>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    RunOnEventLoop * run = new RunOnEventLoop(&a);
    QTimer::singleShot(0, run, SLOT(run()));

    return a.exec();
}

RunOnEventLoop.cpp

#include "runoneventloop.h"

RunOnEventLoop::RunOnEventLoop(QObject *parent) :
    QObject(parent)
{
}

void RunOnEventLoop::run() {
    qDebug() << "hier run";

    camera = new QCamera(0);

        imageCapture = new QCameraImageCapture(camera);
        connect(imageCapture, SIGNAL(readyForCaptureChanged(bool)), this, SLOT(readyForCapture(bool)));

        camera->start(); // to start the viewfinder
}

void RunOnEventLoop::readyForCapture(bool b) {
    qDebug() << "ready of capture "<<b;
}

RunOnEventLoop.h

#ifndef RUNONEVENTLOOP_H
#define RUNONEVENTLOOP_H

#include <QObject>
#include <QDebug>
#include <QCamera>
#include <QCameraImageCapture>

class RunOnEventLoop : public QObject
{
    Q_OBJECT
public:
    explicit RunOnEventLoop(QObject *parent = 0);

private:
    QCamera* camera;
    QCameraImageCapture* imageCapture;

signals:

public slots:
    void run();
    void readyForCapture(bool);

};

#endif // RUNONEVENTLOOP_H

GUI应用程序

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    qDebug() << "hier";

    camera = new QCamera(0);

        imageCapture = new QCameraImageCapture(camera);
        connect(imageCapture, SIGNAL(readyForCaptureChanged(bool)), this, SLOT(readyForCapture(bool)));

        camera->start(); // to start the viewfinder

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::readyForCapture(bool b) {
    qDebug() << "ready of capture "<<b;
}

再次,它是相同的代码。控制台应用程序不会调用readyForCapture方法,而gui应用程序会调用它。

您可以在此处下载存档:DOWNLOAD

1 个答案:

答案 0 :(得分:0)

如果你能提供更多基于控制台的Qt应用程序......你提供的代码,你的主代码如何调用它会很好?

无论如何,只是猜测一下,如果根本没有引发任何事件,可能是因为你没有运行任何事件循环...你确定你的代码在某个时候调用exec() QCoreApplication对象?您确定调用connect()的对象的所有者是QCoreApplication的主题吗?