簡體   English   中英

從QML中的Q_PROPERTY訪問時,QVariantList會嵌套

[英]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++ )

在監視窗口中,您將看到它如何以某種方式嵌套在其他兩個單個元素列表中。

現在,如果我更改信號以發出列表而不是對象,則該列表完全正常且未嵌套。

是否有人遇到了這個問題,或者看到我可能正在做的任何明顯的事情導致這個? 謝謝。 對不起,這么多代碼,這是我能做的最小的工作示例。

該問題是由於要使用以下代碼行復制列表而引起的:

Data::Data( const Data& data ):
    stats{data.stats} 
    // Is similar to stats << data.stats or stats.append(data.stats)
{
}

要在使用{}時添加一個項目(即現有統計數據的另一個統計stats作為QList的統計數據,您必須做的就是使用QList副本構造函數

Data::Data( const Data& data ):
    stats(data.stats)
{
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM