【问题标题】:Access QList object in QML在 QML 中访问 QList 对象
【发布时间】:2015-11-10 11:04:30
【问题描述】:

自 Javascript 以来,我在访问 QList 对象时遇到了一点问题。我有一个 C++ 类,它允许我从 QML/JS 开始执行 SQL 查询。一切正常,我在 C++ 中得到了结果。

我的问题是我向 QML 返回了一个 QList 对象。 这是我在 C++ 中返回 SQL 结果的函数(注意是一个具有不同属性的简单对象):

QList<Note> Storage::setQuery(QString query)
{
    QList<Note> noteItems;
    QSqlQuery qsqlQuery;
    bool ok = qsqlQuery.exec(query);
    if(!ok)
    {
        qDebug() << "Error setQuery" << m_sqlDatabase.lastError();
    }
    else
    {

        while (qsqlQuery.next()) {
            Note my_note;
            QString note = qsqlQuery.value("message").toString();
            my_note.setMessage(note);

            noteItems.append(my_note);
        }
   }

   return noteItems;
}

但是当我从 JS 调用这个函数时,我得到了这个错误:Unknown method return type: QList&lt;Note&gt; 问题是返回类型,QML JS 不知道类型QList&lt;Object&gt;,为什么?我做错了什么

【问题讨论】:

  • 我能问你为什么要在Note 对象中包装一个字符串吗?你不能简单地返回裸字符串吗?
  • Tthis is an example in my code 注意该对象由多个属性组成,例如 Int、String 等 @skypjack
  • @simon 你应该试试我的回答。
  • 今晚我试试你的解决方案@Ansh Kumar

标签: javascript c++ qt qml


【解决方案1】:

如果您想在 Qml 中使用 c++ QList 作为模型,我建议您使用以下过程。我正在使用我自己的示例,您可以根据需要进行更改。

Storage.h

class Storage : public QObject {
    Q_PROPERTY(QQmlListProperty<Note> getList READ getList)

public:
    QQmlListProperty<Note> getList();
    void setQuery(QString query);
    QList<Note> noteItems;;
private:
    static void appendList(QQmlListProperty<Note> *property, Note *note);
    static Note* cardAt(QQmlListProperty<Note> *property, int index);
    static int listSize(QQmlListProperty<Note> *property);
    static void clearListPtr(QQmlListProperty<Note> *property);
};

Storage.cpp

void Field::appendList(QQmlListProperty<Card> *property, Note *note) {
    Q_UNUSED(property);
    Q_UNUSED(note);
}

Note* Field::cardAt(QQmlListProperty<Note> *property, int index) {
    return static_cast< QList<Note> *>(property->data)->at(index);
}

int Field::listSize(QQmlListProperty<Note> *property) {
    return static_cast< QList<Note> *>(property->data)->size();
}
void Field::clearListPtr(QQmlListProperty<Note> *property) {
    return static_cast< QList<Note> *>(property->data)->clear();
}

QQmlListProperty<Note> Field::getList() {
    return QQmlListProperty<Note>( this, &list[0], &appendList, &listSize, &cardAt,  &clearListPtr );
}

void Storage::setQuery(QString query)
{
    QList<Note> noteItems;
    QSqlQuery qsqlQuery;
    bool ok = qsqlQuery.exec(query);
    if(!ok)
    {
        qDebug() << "Error setQuery" << m_sqlDatabase.lastError();
    }
    else
    {

        while (qsqlQuery.next()) {
            Note my_note;
            QString note = qsqlQuery.value("message").toString();
            my_note.setMessage(note);

            noteItems.append(my_note);
        }
   }
}

ma​​in.cpp

int main(int argc, char *argv[])
{
    qmlRegisterType<Note>();
}

QQmlListProperty 类允许应用程序向QML 公开类似列表的属性。要提供列表属性,C++ 类必须实现操作回调,然后从属性获取器返回适当的QQmlListProperty 值。列表属性应该没有设置器。使用 C++ 代码扩展 QML 时,可以将 C++ 类注册到 QML 类型系统,以使该类可以用作 QML 代码中的数据类型。

【讨论】:

  • OP 想要从一个方法返回一个列表,他不想为他的对象定义一个新属性。这是一个矫枉过正的解决方案。
  • 他想将 c++ 类的QList 发送到qml。我还以为他不懂基础。这就是我提出完整解决方案的原因。
  • 问题空间内错误的完整解决方案。
  • 我想我已经剥离了足够多的答案。你怎么看?
  • 据我所知,QML 中透明支持的序列类型是 QList&lt;int&gt;QList&lt;qreal&gt;QList&lt;bool&gt;QList&lt;QString&gt;QList&lt;QUrl&gt;QML 引擎提供QVariantList 和JavaScript 数组之间以及QVariantMap 和JavaScript 对象之间的自动类型转换。但是这些不支持自定义类对象作为其列表内容。要传输QList&lt;object&gt;,必须使用它的getter 和setter 定义一个新属性。如果我错了,请纠正我。
【解决方案2】:

您是否将 Note 注册为元类型?可能这就是缺少的:

http://doc.qt.io/qt-5/qmetatype.html#Q_DECLARE_METATYPE

在 Qt 4 中,您还必须注册 QList&lt;Note&gt;,但在 Qt 5 中则不需要。

哦,Note 应该是Q_GADGET,否则你也不能从 QML 访问它的内容。确保您使用 Qt 5.5+。否则,您将需要 QList&lt;Note*&gt; 并使这些 Note 对象继承自 QObject

【讨论】:

  • 不,我没有将 Note 注册为元类型,我今晚试试@milianw
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-22
  • 1970-01-01
  • 2018-05-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多