2015-01-28 6 views
0

Мне нужно иметь массив объектов класса, которые должны быть доступны в Qt, а также QML.Как получить доступ к QList QObject * в QML и Qt?

Учитывая https://stackoverflow.com/a/15830797/462608 следующее, что я пробовал.

Теперь мне нужно знать, как читать и писать к функциям ClassA через Qt и QML.

См. Инструкцию print в конструкторе в файле .h. Это вызывает ошибку сегментации.

class.h

#ifndef CLASSA 
#define CLASSA 

#include <QQuickItem> 

class ClassA : public QObject 
{ 
private: 
    Q_OBJECT 

    Q_PROPERTY(int one READ one WRITE setOne NOTIFY oneChanged) 
    int m_one; 

public: 
    ClassA() {} 
    int one() const { return m_one; } 

public slots: 
    void setOne(int arg) 
    { 
     if (m_one == arg) 
      return; 

     m_one = arg; 
     emit oneChanged(arg); 
    } 

signals: 
    void oneChanged(int arg); 
}; 

class ClassB : public QObject 
{ 
private: 
    Q_OBJECT 

    Q_PROPERTY(QList <QObject*> objClassAList READ objClassAList WRITE setObjClassAList NOTIFY objClassAListChanged) 
    QList <QObject*> m_objClassAList; 

public: 
    ClassB() 
    { 
     QList <QObject*> localObjList; 
     for (int i = 0; i < 5; i++) 
     { 
      ClassA localObj; 
      localObj.setOne (100); 
      localObjList.push_back (&localObj); 
     } 

     setObjClassAList (localObjList); 
     qDebug() << "QQQQQQQQQQQQQQ: " << objClassAList()[0]->property ("one"); 
    } 

    QList <QObject*> objClassAList() const { return m_objClassAList; } 

public slots: 
    void setObjClassAList (QList <QObject*> arg) 
    { 
     if (m_objClassAList == arg) 
      return; 

     m_objClassAList = arg; 
     emit objClassAListChanged(arg); 
    } 

signals: 
    void objClassAListChanged (QList <QObject*> arg); 
}; 

#endif // CLASSA 

main.cpp

#include <QGuiApplication> 
#include <QQmlApplicationEngine> 
#include "class.h" 

int main(int argc, char *argv[]) 
{ 
    QGuiApplication app(argc, argv); 

    const char* what = "WHAT"; 

    qmlRegisterType <ClassA> (what, 1, 0, "A"); 
    qmlRegisterType <ClassB> (what, 1, 0, "B"); 

    QQmlApplicationEngine engine; 
    engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); 

    return app.exec(); 
} 

main.qml

import QtQuick 2.4 
import QtQuick.Window 2.2 
import WHAT 1.0 

Window { 
    visible: true 

    B 
    { 
     onObjClassAListChanged: 
     { 

     } 
    } 
} 
+0

Разбить линию objClassAList() [0] -> свойство («один») и проверить, что возвращаемый массив имеет действительный QList с хотя бы одним элементом в нем. Кроме того, objClassAList() [0] -> свойство («один») -> isValid() возвращает true? – TheDarkKnight

ответ

1

Проблема заключается в том, что вы пытаетесь получить доступ к указателю удаления, который был выделен в стеке. Выделите ClassA в куче вместо этого, и он должен исправить вашу проблему.

ClassB() 
{ 
    QList <QObject*> localObjList; 
    for (int i = 0; i < 5; i++) 
    { 
     ClassA localObj; //This object is delete after it goes out of scope 
     localObj.setOne (100); 
     localObjList.push_back (&localObj); //After this line &localObj is a dangling pointer to delete memory 
    } 

    setObjClassAList (localObjList); 
    qDebug() << "QQQQQQQQQQQQQQ: " << objClassAList()[0]->property ("one"); 
} 

Например, я предлагаю изменить его на:

ClassB() 
{ 
    QList <QObject*> localObjList; 
    for (int i = 0; i < 5; i++) 
    { 
     ClassA localObj = new ClassA(); 
     localObj->setOne (100); 
     localObjList.push_back(localObj); 
    } 

    setObjClassAList (localObjList); 

    //This should work now. 
    qDebug() << "QQQQQQQQQQQQQQ: " << objClassAList()[0]->property ("one"); 
} 

Это должно решить вашу ошибку сегментации. Все остальное выглядит хорошо.

+0

Хорошо, попробуем это. Как получить доступ к тому же в qml? –

+1

onObjClassAListChanged: { console.log ("Первый элемент:" + objClassAList [0] .one) } – vpicaver

+1

Вы можете получить доступ к QList как яваскрипт массив. – vpicaver

Смежные вопросы