黑莓10 - BBOS 10文件选择器不能正确返回信号



我在黑莓10上实现了一个本地文件选择器,经过一些混乱之后,它终于识别了这个类,它打开并返回控制台上的文件地址,但它看起来像两个信号不能正常工作,在头脑中这几乎是黑莓10文档的直接代码副本。

    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,有人知道我在哪里搞砸了,或者我如何得到QFileDialog类被SDK找到?

我只是想给你一点解释,以防你仍然有一些麻烦。当我开始使用Qt时,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();
            }
        }
    }
}

就像Richard说的,大部分文档都涵盖了如何创建信号/槽,所以你可以回顾一下,但也可以看看Git上的一些cascade - samples。

希望有帮助!!

最新更新