我在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类?
答案 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
信号。在这种情况下,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();
}
}
}
}
就像理查德所说的那样,大多数文档都涵盖了如何创建信号/插槽,因此您可以查看,但也可以查看一些Cascades-Samples on Git。
希望有所帮助!!!