C ++ / QML序列数据交换

时间:2016-02-12 08:33:23

标签: c++ type-conversion qml

是否可以将QList<T>从C ++公开到QML,其中T类型已被元对象系统所知?

//C++:
class Data : public QObject {
    Q_OBJECT
    Q_PROPERTY(QList<QGeoCoordinate> path READ path WRITE setPath NOTIFY pathChanged)

作为QML的上下文属性公开的Data实例,但在QML端路径属性未定义。 在文档中写的

  

特别是,QML目前支持:

QList<int>
QList<qreal>
QList<bool>
QList<QString> and QStringList
QList<QUrl>
     

其他序列类型不是透明支持的,而是一个   任何其他序列类型的实例将在QML和C ++之间传递   作为不透明的QVariantList。

但看起来像对QVariantList的不透明转换不起作用。 我正在使用Qt 5.6 RC快照。

1 个答案:

答案 0 :(得分:1)

我不确定转换为QVariantList到底应该发生什么。我无法看到您如何能够访问列表中的内容,因为所包含的类型不是QObject。我认为那里的文件可以更清晰。

但您可以使用QQmlListProperty代替。 Extending QML using Qt C++有更多关于其使用的信息。以下是该示例的源代码中的directory.cpp

/*
    Function to append data into list property
*/
void appendFiles(QQmlListProperty<File> *property, File *file)
{
    Q_UNUSED(property)
    Q_UNUSED(file)
    // Do nothing. can't add to a directory using this method
}

/*
    Function called to retrieve file in the list using an index
*/
File* fileAt(QQmlListProperty<File> *property, int index)
{
    return static_cast< QList<File *> *>(property->data)->at(index);
}

/*
    Returns the number of files in the list
*/
int filesSize(QQmlListProperty<File> *property)
{
    return static_cast< QList<File *> *>(property->data)->size();
}

/*
    Function called to empty the list property contents
*/
void clearFilesPtr(QQmlListProperty<File> *property)
{
    return static_cast< QList<File *> *>(property->data)->clear();
}

/*
    Returns the list of files as a QQmlListProperty.
*/
QQmlListProperty<File> Directory::files()
{
    refresh();
    return QQmlListProperty<File>(this, &m_fileList, &appendFiles, &filesSize, &fileAt, &clearFilesPtr);
}

您也可以通过展示QList of QObject-derived types来做类似的事情,但这有其自身的后备。