如何从QML获取数据到C ++?

时间:2014-08-08 11:07:23

标签: c++ qt qml

我尝试使用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列表直接?

1 个答案:

答案 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");

现在您正在连接信号和插槽。而已。