gpt4 book ai didi

c++ - 将对象从 QML 传递到 C++

转载 作者:太空狗 更新时间:2023-10-29 21:40:53 27 4
gpt4 key购买 nike

我正在开发一个简单的应用程序来演示 C++ 与 QML 的集成,但我遇到了问题。简而言之,我想在 qml 中动态创建一个 C++ 对象并将其传递给 C++ 进行处理。这是我的代码。

import QtQuick 2.4
import QtQuick.Window 2.2

import test 1.0

Window {
visible: true
MainForm {
anchors.fill: parent

mouseArea.onClicked: {

console.log("clicked")

var student = Qt.createComponent("Student")

student.name = "Hello frome QML";

console.log( student.name ) // good

school.addStudent( student )

}
}
}

学生.h

#ifndef STUDENT_H
#define STUDENT_H

#include <QObject>

class Student : public QObject
{
Q_OBJECT
QString m_name;

public:
explicit Student(QObject *parent = 0);
~Student();

Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged)

QString name() const
{
return m_name;
}

signals:

void nameChanged(QString arg);

public slots:
void setName(QString arg)
{
if (m_name == arg)
return;

m_name = arg;
emit nameChanged(arg);
}
};

#endif // STUDENT_H

现在当我 addStudent() 到学校类(class)时,哪里就有麻烦。关注下面的 .cpp 文件。

#include "school.h"
#include <QDebug>

School::School(QObject *parent) : QObject(parent)
{

}

School::~School()
{

}

// why does this not work? it cause compiler error..can't access private members of QObject
//void School::addStudent(Student student)
//{
//// students.append( &student );

//// qDebug() << "added";

//// qDebug() << student.name();// << " was added to school";
//}

void School::addStudent(Student * student)
{
students.append( student );

qDebug() << "added";

qDebug() << student->name();// if this line is there, it breaks the application
}

问题也在代码中的注释中,但摘要:

  1. 为什么当我尝试访问 student.name 时 addStudent() 会崩溃?我可以在设置后在 qml 文件中访问它。

  2. 如果我像代码中那样按值传递 Student,为什么我的项目无法编译?

其他想法

这似乎与 C++ 函数执行时被销毁的 C++ 对象有关。在 QML 中创建的 C++ 对象的生命周期是什么?什么时候销毁?对象的生命周期会成为这里的问题吗?

最佳答案

假设您通过cpp 文件中的qmlRegisterTypeStudent 类型注册到QML。

在您的 QML 中,Qt.createComponent("Student") 不会创建 Student 对象,而是创建一个 QQmlComponent。尝试设置 name 以外的属性,它仍然有效,因为对象不是 Student。相反,您应该通过 Component.createObject 从预定义的组件创建一个对象。 :

MainForm {
id: mainForm
mouseArea.onClicked: {
var student = studentComponent.createObject(mainForm);
student.name = "Hello frome QML";
school.addStudent( student );
}

Component {
id: studentComponent
Student{}
}
}

现在一切正常。


回到你的代码,

//QML
var student = Qt.createComponent("Student")
student.name = "Hello frome QML";
console.log( student.name ) // good

不,这不好。 student.abcdefg = "Hello from QML" 也可以。添加console.log(student),可以看到student不是Student

Why does addStudent() crashes when I try to access student.name? I can access it though in the qml file after I set it.

它崩溃了,因为从 QML 传递的对象不是指针 Student。 QML 引擎将空指针传递给此函数。您在 QML 中访问的不是 Student

Why does my project not compile if I pass Student by value like seen in the code?

因为Student是一个QObject,它是不可复制的。而是通过指针传递。

What is the life cycle of C++ object created in QML? When does it gets destroyed? Could the lifetime of the object be an issue here?

生命周期在您的 QML 中不是问题,因为您创建的是一个组件,而不是一个对象。在这个答案中创建 Student 对象时,

var student = studentComponent.createObject(mainForm);

新创建的对象将 mainForm 设置为它的父对象。在释放 mainForm 之前,该对象不会被删除。除非您明确删除它。

关于c++ - 将对象从 QML 传递到 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30176856/

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