如何从QML到c++获取数据

How to get data from QML to C++?

本文关键字:c++ 获取 数据 QML      更新时间:2023-10-16

我尝试使用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() << "Getn";
    }
};

............................................

 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列表?

嗯,您正在尝试将url列表从qml传递到c++。这些就是方法。

1)通过调用QQmlContext::setContextProperty()并注册该对象,确保QML可以使用MyClass的对象。

的例子:

 QQuickView view;
 MyClass myObj;
 view.rootContext()->setContextProperty("myObj", &myObj);

然后你可以像这样从QML调用你的MyClass::addToPlaylist()

FileDialog{onAccepted: myObj.addToPlaylist(fileDialog.fileUrls);}
参考:使用上下文属性将c++对象嵌入到QML中

2)当用户从QML中选择文件时,使FileDialog实例发出信号。现在这个信号需要连接到MyClass对象的插槽上。为了做到这一点,你需要有指向FileDialog实例和MyClass对象的指针。

你得到了一个指向FileDialog实例的指针。

QObject *fileDialog = root->findChild<QObject *>("column")->findChild<QObject *>("row")->findChild<QObject *>("openButton")->findChild<QObject*>("fileDialog");

现在您正在连接信号和插槽。那它。