gpt4 book ai didi

c++ - QML:自定义 QObject 类型错误

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:28:44 25 4
gpt4 key购买 nike

我正在 QML 中尝试一些东西,试图让两者更容易无缝地合并;准确地说,我正在尝试将具有结构化数据的对象链接到 QML。

我有以下设置:

主要.cpp:

#include <QApplication>
#include <QQmlApplicationEngine>
#include <QtQml>
#include "dataobject.h"

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

qmlRegisterType<DataObject>("DO", 1,0,"DataObject");

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

return app.exec();
}

数据对象.h:

#ifndef DATAOBJECT_H
#define DATAOBJECT_H

#include <QObject>
#include <QVariant>
#include <iostream>

class DataObject : public QObject
{
Q_OBJECT
Q_PROPERTY(qreal a MEMBER a NOTIFY aChanged)
Q_PROPERTY(qreal b MEMBER b NOTIFY bChanged)
public:
explicit DataObject(QObject *parent = 0);

signals:
void aChanged();
void bChanged();

public slots:
void printState() {
using namespace std;
cout << a << ", " << b << endl;
}

private:
qreal a;
qreal b;
};

#endif // DATAOBJECT_H

数据对象.cpp:

#include "dataobject.h"

DataObject::DataObject(QObject *parent) :
QObject(parent)
{
connect(this, SIGNAL(aChanged()), this, SLOT(printState()));
connect(this, SIGNAL(bChanged()), this, SLOT(printState()));
}

主.qml:

import DO 1.0

ApplicationWindow {
visible: true
width: 640
height: 480
title: qsTr("Hello World")

menuBar: MenuBar {
Menu {
title: qsTr("File")
MenuItem {
text: qsTr("Exit")
onTriggered: Qt.quit();
}
}
}
Text {
text: qsTr("Hello World")

MouseArea {
property DataObject myData;
anchors.fill: parent
drag.target: parent

onReleased: {
myData.a = mouse.x;
myData.b = mouse.y;
}
}
}
}

qml.qrc:

<RCC>
<qresource prefix="/">
<file>main.qml</file>
</qresource>
</RCC>

现在,我希望 QML 生成的值可以直接馈送到 C++ 中的对象(即 MouseArea 中的 onReleased 处理程序试图写入 myData 字段)。然而,这个基本的概念证明不起作用,但我真的不明白为什么。

我得到的错误(在拖动和释放鼠标按钮时)是:qrc:///main.qml:29:TypeError:类型错误

它与行“myData.a = mouse.x;”相匹配,因此它立即失败。

知道我哪里出错了吗?我尝试过使用 int、double、QVariant 和 qreal 字段,但都没有用。 QML 是否根本无法像这样链接对象?如果是这样,知道如何在 Qt 源代码中实现例如 anchors.fill 吗?

最佳答案

如果您在错误来自的行上分解表达式,它会有所帮助。尝试先打印 myData.a:

print(myData.a)
myData.a = mouse.x;
myData.b = mouse.y;

qrc:///main.qml:31: TypeError: Cannot read property 'a' of null

所以,myDatanull。我们可以使用另一个基于 QObject 的类型来验证这一点:

MouseArea {
property DataObject myData;
property Item item
anchors.fill: parent
drag.target: parent

onReleased: {
print(item)
myData.a = mouse.x;
myData.b = mouse.y;
}
}

qml: null

因此,您可以通过初始化属性来修复此错误:

property DataObject myData: DataObject {}

您可以将基于 QObject 的属性视为 JavaScript 的指针;它们可以是 null 或指向一个有效的对象...或者是 undefined。 :) 我找不到关于此的任何提及 here ,但这是应该提及此行为的地方。

如果您想简化事情,您可以通过将对象设为 MouseArea 的子对象而不是属性来为您默认构造该对象:

MouseArea {
DataObject {
id: myData
}
anchors.fill: parent
drag.target: parent

onReleased: {
myData.a = mouse.x;
myData.b = mouse.y;
}
}

目前,您无法从 C++ 中引用此属性。但是,您可以通过两种方式实现这一点:

  1. 声明 property alias到项目。
  2. 给它一个 objectName 并使用 QObject::findChild找到它。

关于c++ - QML:自定义 QObject 类型错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25693953/

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