我在黑莓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
信号将被触发。本例中的slot
是onFileSelected
函数(预定义的),它将所选文件的文件路径(信号中的一个参数)记录到控制台。
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。
希望有帮助!!