[英]How to access a QList of QObject* in QML and Qt?
I need to have an array of class objects which should be accessible in Qt as well as QML. 我需要有一组可以在Qt和QML中访问的类对象。
Considering https://stackoverflow.com/a/15830797/462608 following is what I have tried. 考虑https://stackoverflow.com/a/15830797/462608,这是我尝试过的。
Now I need to know how to read and write to the functions of ClassA
through Qt
and QML
. 现在,我需要知道如何通过Qt
和QML
读写ClassA
的功能。
See the print statement in the constructor in .h file. 请参阅.h文件中的构造函数中的print语句。 That produces a segmentation fault. 这会产生分段错误。
class.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 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 main.qml
import QtQuick 2.4
import QtQuick.Window 2.2
import WHAT 1.0
Window {
visible: true
B
{
onObjClassAListChanged:
{
}
}
}
The problem is you're trying to access a delete pointer that was allocated on the stack. 问题是您正在尝试访问在堆栈上分配的删除指针。 Allocate ClassA on the heap instead, and it should fix your problem. 而是在堆上分配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");
}
For example, I suggest modifying it to: 例如,我建议将其修改为:
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");
}
This should solve your segmentation fault. 这应该可以解决您的细分错误。 Everything else looks okay. 其他一切都还好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.