BBOS 10文件选择器无法正确返回信号

时间:2014-03-24 19:24:34

标签: blackberry-10

我在BlackBerry 10上实现了一个原生的文件选择器,经过一段时间的麻烦后终于认出了这个类,它打开正常并返回控制台上的文件地址,但看起来两个信号无法正常工作,请记住这几乎是BlackBerry 10 docs代码的直接副本。

    using namespace bb::cascades::pickers;
void Utils::getFile() const{

     FilePicker* filePicker = new FilePicker();
    filePicker->setType(FileType::Music);
    filePicker->setTitle("Select Sound");
    filePicker->setMode(FilePickerMode::Picker);
    filePicker->open();

    // Connect the fileSelected() signal with the slot.
    QObject::connect(filePicker,
        SIGNAL(fileSelected(const QStringList&)),
        this,
        SLOT(onFileSelected(const QStringList&)));

    // Connect the canceled() signal with the slot.
    QObject::connect(filePicker,
        SIGNAL(canceled()),
        this,
        SLOT(onCanceled()));
}

我希望它将文件url返回到qml(使用QFileDialog但在我的SDK上无法识别)var test=utils.getFile() if(test=="") console.debug("empty") else console.debug(test)

但我从控制台收到这些消息:Object::connect: No such slot Utils::onFileSelected(const QStringList&) in ../src/Utils.cpp:27 Object::connect: No such slot Utils::onCanceled() in ../src/Utils.cpp:33

它在打开时从qml函数中的else返回undefined, 有谁知道我在哪里翘起来或如何让SDK找到QFileDialog类?

1 个答案:

答案 0 :(得分:0)

我只是想给你一些解释,以防你仍有一些麻烦。当我开始使用时,Qt中的概念对我来说有点陌生。

有几种方法可以做到这一点。最简单的可能是纯QML路线:

import bb.cascades 1.2
import bb.cascades.pickers 1.0

Page {
    attachedObjects: [
        FilePicker {
            id: filePicker
            type: FileType.Other
            onFileSelected: {
                console.log("selected files: " + selectedFiles)
            }
        }
    ]

    Container {
        layout: DockLayout {

        }
        Button {
            id: launchFilePicker
            text: qsTr("Open FilePicker")
            onClicked: {
                filePicker.open();
            }
        }
    }
}

当您点击launchFilePicker按钮时,它会调用FilePicker。选择文件后,将触发fileSelected信号。在这种情况下,slotonFileSelected函数(预定义),它将所选文件的文件路径(信号中的参数)记录到控制台。


C ++路线是一项更多的工作,但仍然可行。

如果您的班级文件名为Util,那么您的Util.h看起来像这样:

#ifndef UTIL_H_
#define UTIL_H_

#include <QObject>

class QStringList;

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

    Q_INVOKABLE
    void getFile() const;

private Q_SLOTS:
    void onFileSelected(const QStringList&);
    void onCanceled();
};

#endif /* UTIL_H_ */

请注意Q_INVOKABLE getFile()方法。 Q_INVOKABLE最终将允许我们直接从QML调用此方法。

相应的Util.cpp将如下所示:

#include "Util.h"

#include <QDebug>
#include <QStringList>
#include <bb/cascades/pickers/FilePicker>

using namespace bb::cascades;
using namespace bb::cascades::pickers;

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

void Util::getFile() const
{
    FilePicker* filePicker = new FilePicker();
    filePicker->setType(FileType::Other);
    filePicker->setTitle("Select a file");
    filePicker->setMode(FilePickerMode::Picker);
    filePicker->open();

    QObject::connect(
            filePicker,
            SIGNAL(fileSelected(const QStringList&)),
            this,
            SLOT(onFileSelected(const QStringList&)));

    QObject::connect(
            filePicker,
            SIGNAL(canceled()),
            this,
            SLOT(onCanceled()));
}

void Util::onFileSelected(const QStringList &stringList)
{
    qDebug() << "selected files: " << stringList;
}

void Util::onCanceled()
{
    qDebug() << "onCanceled";
}

要使Q_INVOKABLE getFile()方法可用于QML,您需要创建一个实例并将其设置为ContextProperty。我这样做applicationui.cpp就像这样:

Util *util = new Util(app);
QmlDocument *qml = QmlDocument::create("asset:///main.qml").parent(this);
qml->setContextProperty("_util", util);

然后,您可以从QML调用此Q_INVOKABLE getFile()方法:

Page {
    Container {
        layout: DockLayout {}
        Button {
            id: launchFilePicker
            text: qsTr("Open FilePicker")
            onClicked: {
                _util.getFile();
            }
        }
    }
}

就像理查德所说的那样,大多数文档都涵盖了如何创建信号/插槽,因此您可以查看,但也可以查看一些Cascades-Samples on Git

希望有所帮助!!!