如何响应Blackberry Cascades中的photoSaved信号

How to respond to the photoSaved signal in Blackberry Cascades

本文关键字:Cascades 中的 photoSaved 信号 Blackberry 何响应 响应      更新时间:2023-10-16

好的,所以我使用的是黑莓10级联(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++信号,因为我需要照片的文件名,但这不起作用,正如我上面所说的。

我解决了这个问题。线路:

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

由于qml代码中没有实际的"objectName:camera1",只有"id:ccamera 1",因此无法将cameraDevice_连接到onPhotoSaved插槽,因为它为null。

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