我尝试使用FileDialog编写一些应用程序,我必须在我的C ++类中获取文件URL。我试着这样做:
FileDialog {
id: fileDialog
objectName: "fileDialog"
selectMultiple: true
signal getFiles(var urls)
title: qsTr("Open file")
nameFilters: [qsTr("MP3 files (*.mp3)"), qsTr("All files (*.*)")]
onAccepted: getFiles(fileDialog.fileUrls)
}
........................................
class MyClass : public QObject
{
Q_OBJECT
public slots:
void addToPlaylist (const QList<QUrl> & urls){
for(int i = 0; i < urls.length(); ++i)
qDebug() << "Get\n";
}
};
............................................
QObject *fileDialog = root->findChild<QObject *>("column")->findChild<QObject *>("row")->findChild<QObject *>("openButton")->findChild<QObject*>("fileDialog");
MyClass myClass;
QObject::connect(fileDialog, SIGNAL(getFiles(QVariant)), &myClass, SLOT(addToPlaylist(QList<QUrl>)));
我找到了解决方案,但我不明白。有人可以在我的例子中解释我吗?
只是一个问题(也许是解决方案),为什么需要定义一个 在QML中发出信号吗?你不能简单地调用c ++插槽并通过 URL列表直接?
答案 0 :(得分:0)
好吧,你试图将一个url列表从qml传递给c ++。这些都是方法。
1)确保通过调用MyClass
并注册该对象,使QQmlContext::setContextProperty()
的对象可用于QML。
示例:
QQuickView view;
MyClass myObj;
view.rootContext()->setContextProperty("myObj", &myObj);
然后你可以像这样从QML打电话给你MyClass::addToPlaylist()
。
FileDialog{onAccepted: myObj.addToPlaylist(fileDialog.fileUrls);}
Reference: Embedding C++ Objects into QML with Context Properties
2)每当用户从QML中选择一些文件时,使FileDialog
实例发出信号。现在,此信号需要连接到MyClass
对象的插槽。为此,您需要指向FileDialog
实例和MyClass
对象的对象。
通过执行此操作,您将获得指向FileDialog
实例的指针。
QObject *fileDialog = root->findChild<QObject *>("column")->findChild<QObject *>("row")->findChild<QObject *>("openButton")->findChild<QObject*>("fileDialog");
现在您正在连接信号和插槽。而已。