c++ - 如何响应 Blackberry Cascades 中的 photoSaved 信号

标签 c++ qt camera qml blackberry-cascades

好的,所以我正在使用 Blackberry 10 Cascades(QT、QML、C++),我正在尝试处理相机拍摄的照片。我一直在研究如何在互联网上执行此操作,并想出了一些办法,但它还没有用。这是我所做的(我已经用//----------------RELEVANT LINE(S) OF CODE----- 突出显示了代码中最相关的部分-------------------------- 开始和 //-------------------------------------------- ---------------------- 结束相关部分。

//相机.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_ */

//相机.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");

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

这是一个愚蠢的错误,但我希望这个问题和答案可以帮助那些正在寻找如何在黑莓级联中处理保存的照片,或者只是在 QT 中处理信号和槽,或者其他方式的人这可能会对他们有所帮助。

关于c++ - 如何响应 Blackberry Cascades 中的 photoSaved 信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17353166/

相关文章:

C++/CX 限制

Android 相机像素操作

安卓相机触摸对焦

c++ - 将字符串从对话框传递到 MainWindow?

c++ - Qt:数据目录的路径

c++ - 将 QImage 绑定(bind)到纹理以在 QOpenGLWidget 中显示视频的正确方法是什么

Android - 相机预览是横向的

c++ - 向 QTabWidget 添加选项卡后 Qt App 崩溃

c++ - 为什么具有非常量复制构造函数的类不被视为可复制构造?

c++ - 动态声明数组背后的静态声明