gpt4 book ai didi

javascript - 在 QML 中访问 QList 对象

转载 作者:行者123 更新时间:2023-11-30 02:35:25 24 4
gpt4 key购买 nike

自 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<Note>问题是返回类型,QML JS 不知道类型 QList<Object> , 为什么?我做错了什么

最佳答案

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

存储.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);
};

存储.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);
}
}
}

main.cpp

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

QQmlListProperty类允许应用程序向 QML 公开类似列表的属性.要提供列表属性,C++ 类必须实现操作回调,然后返回适当的 QQmlListProperty。来自属性 getter 的值。列表属性不应有二传手。扩展时 QML使用 C++ 代码,可以使用 QML 注册 C++ 类类型系统使类能够用作 QML 中的数据类型代码。

关于javascript - 在 QML 中访问 QList 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33628535/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com