![](/img/trans.png)
[英]How to access Q_PROPERTY of QStringlist from Q_PROPERTY of MyClass * in qml?
[英]QVariantList becomes nested when accessed from Q_PROPERTY in QML
我在通過另一個Q_GADGET對象中的Q_PROPERTY訪問由Q_GADGET對象組成的QVariantList時遇到一個奇怪的問題。 由於某種原因,當通過屬性訪問它們時,列表將自身嵌套在兩個元素中,如下所示:
可變手表截圖
這是一個小而有效的示例,它說明了我遇到的問題。
應用類別:
#pragma once
#include <QObject>
#include "Data.h"
class App : public QObject
{
public:
explicit App( QObject* parent = nullptr );
public slots:
void getData() const;
signals:
void dataReady( const Data& data ) const;
private:
Q_OBJECT
};
#include "App.h"
App::App( QObject* parent )
{
}
void App::getData() const
{
emit dataReady( Data() );
}
資料類別:
#pragma once
#include <QObject>
#include <QVariant>
#include "Stats.h"
class Data
{
public:
Data();
Data( const Data& data );
~Data() = default;
public slots:
QList< QVariant > getStats() const;
private:
Q_GADGET
Q_PROPERTY( QList< QVariant > stats READ getStats CONSTANT )
QList< QVariant > stats;
void fillStats();
};
Q_DECLARE_METATYPE(Data)
#include "Stats.h"
#include "Data.h"
Data::Data()
{
fillStats();
}
Data::Data( const Data& data ) :
stats{ data.stats }
{
}
void Data::fillStats()
{
for ( int i = 0; i < 10; i++ )
stats.append( QVariant::fromValue( Stats( i ) ) );
}
QList< QVariant > Data::getStats() const
{
return stats;
}
統計資料類別:
#pragma once
#include <QObject>
class Stats
{
public:
Stats() = default;
Stats( int val );
Stats( const Stats& stats );
~Stats() = default;
public slots:
int getValue() const;
private:
Q_GADGET
Q_PROPERTY( int value READ getValue CONSTANT )
int value;
};
Q_DECLARE_METATYPE(Stats)
#include "Stats.h"
Stats::Stats(const Stats& stats) :
value{ stats.value }
{
}
Stats::Stats(int val) :
value{ val }
{
}
int Stats::getValue() const
{
return value;
}
main.cpp:
#include <QGuiApplication>
#include <QMetaType>
#include <QQmlApplicationEngine>
#include "App.h"
#include "Stats.h"
#include "Data.h"
int main( int argc, char* argv[] )
{
QGuiApplication app( argc, argv );
QQmlApplicationEngine engine;
qRegisterMetaType< Data >( "Data" );
qRegisterMetaType< Stats >( "Stats" );
qmlRegisterType< App >( "Test", 1, 0, "App" );
engine.load( QUrl( QStringLiteral( "qrc:/main.qml" ) ) );
if (engine.rootObjects().isEmpty())
return -1;
return app.exec();
}
main.qml:
import QtQuick 2.6
import QtQuick.Window 2.2
import Test 1.0
Window
{
visible: true
width: Screen.width
height: Screen.height
title: qsTr("Hello World")
Component.onCompleted: app.getData()
App
{
id: app
}
Connections
{
target: app
onDataReady: iterateThroughData( data )
}
function iterateThroughData( data )
{
for ( var i = 0; i < data.stats.length; i++ )
console.log( "broken here... somehow gets nested." );
}
}
現在,如果您在main.qml的以下行上放置一個斷點:
for ( var i = 0; i < data.stats.length; i++ )
在監視窗口中,您將看到它如何以某種方式嵌套在其他兩個單個元素列表中。
現在,如果我更改信號以發出列表而不是對象,則該列表完全正常且未嵌套。
是否有人遇到了這個問題,或者看到我可能正在做的任何明顯的事情導致這個? 謝謝。 對不起,這么多代碼,這是我能做的最小的工作示例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.