如何应对Blackberry Cascades中的photoSaved信号

时间:2013-06-27 21:05:31

标签: c++ qt camera qml blackberry-cascades

好的,我正在使用Blackberry 10 Cascades(QT,QML,C ++),我正在尝试处理相机拍摄的照片。我一直在研究如何在互联网上做这个,并找出一些东西,但它还没有工作。这就是我所做的(我已经指出用// ---------------相关的代码行-----强调代码中最相关的部分----- ----------------------------开始和 // ------------------------------------------------ ------------------------结束相关部分。

// Camera.h

#ifndef CAMERA_H_
#define CAMERA_H_

#include <QObject>
#include <Page.h>


namespace bb {
    namespace cascades {
        class Container;
        namespace multimedia {
            class Camera;
        }
    }
}

namespace GDLiteBB {

    class Camera : public QObject, public Page_ {
        Q_OBJECT

        //-----------------RELEVANT LINE OF CODE---------------------
        bb::cascades::multimedia::Camera *cameraDevice_;
        //-----------------------------------------------------------

        static Camera *Camera_;

        Camera(
            QString *qmlFileName = new QString(""),
            QString *qmlVarName = new QString(""),
            QObject *parent = 0);

    public:

        static Camera *getInstance(
            QString *qmlFileName = new QString("main.qml"),
            QString *qmlVarName = new QString("camera"),
            QObject *parent = 0);

        virtual ~Camera();

    Camera *show(bb::cascades::Container *container = 0);

    void showCamera();

        //-----------------RELEVANT LINES OF CODE---------------------
        public slots:
        void onPhotoSaved(const QString &fileName, quint64 length);
       //-------------------------------------------------------------
};

} /* namespace GDLiteBB */

#endif /* CAMERA_H_ */

// Camera.cpp

Camera::Camera(
    QString *qmlFileName,
    QString *qmlVarName,
    QObject *parent)
: QObject(parent),
    Page_(qmlFileName, qmlVarName) 
{
    INIT_PAGE

    if (Root_) {
        //-----------------RELEVANT LINES OF CODE---------------------
        cameraDevice_ =
            Root_->findChild<bb::cascades::multimedia::Camera *>("camera1");

        connect(cameraDevice_, SIGNAL(photoSaved(const QString&, quint64)), this,
            SLOT(onPhotoSaved(const QString&, quint64)));
       //----------------------------------------------------------------

    } else {
        cameraDevice_ = 0;
    }
}

//-----------------RELEVANT LINES OF CODE---------------------
void Camera::onPhotoSaved(
    const QString &fileName,
    quint64 length)
{
    disconnect(
        cameraDevice_,
        SIGNAL(photoSaved(const QString&, quint64)),
        this,
        SLOT(onPhotoSaved(const QString&, quint64)));

    qDebug() << "onPhotoSaved";
    qDebug() << "filename is " << fileName << ", length is " << length << "test";
}
//-----------------------------------------------------------------

但是当我拍照时,没有触发onPhotoSaved插槽,因为qDebug没有发生。

我知道照片正在保存,因为在qml中,我有:

Label {
    id: cameraDebug
}
Camera {
    ...
    onPhotoSaved: {
        photoBeingTaken = false;
        cameraDebug.text = "saved photo"
    } 
}

并且标签cameraDebug在拍照后更改为“已保存的照片”。所以我正在捕捉已保存照片的QML信号,但我需要捕获C ++信号以保存照片,因为我需要文件名这张照片,就像我上面所说的那样无效。

1 个答案:

答案 0 :(得分:1)

我弄明白了这个问题。这一行:

cameraDevice_ = Root_->findChild<bb::cascades::multimedia::Camera *>("camera1");

正在分配null,因为qml代码中没有实际的“objectName:camera1”,只有“id:camera1”,因此,没有办法将cameraDevice_连接到onPhotoSaved插槽,因为它是null。

这是一个愚蠢的错误,但我希望这个问题和答案可能有益于其他想要了解如何在黑莓级联中处理已保存的照片,或者只是处理QT中的信号和插槽,或者其他什么它可能对他们有所帮助。