gpt4 book ai didi

c++ - Qt:将 C++ 类暴露给 QML 时出错

转载 作者:搜寻专家 更新时间:2023-10-31 02:08:06 26 4
gpt4 key购买 nike

当我运行应用程序时,我总是遇到同样的错误:

qrc:/main.qml:13: ReferenceError: _myClass is not defined

错误在哪里?

此外,如果我想将信号 myIntChanged 连接到插槽,我应该将连接放在哪里?在 main.cpp 中还是在构造函数 MyClass 中?

myclass.h

#ifndef MYCLASS_H
#define MYCLASS_H

#include <QObject>
#include <QString>
#include <QDebug>
#include <QTimer>

class MyClass : public QObject
{
Q_OBJECT

public:
MyClass(QObject *parent = 0);

Q_PROPERTY(int myInt READ getMyInt WRITE setMyInt NOTIFY myIntChanged)
int myInt;
inline int getMyInt() { return myInt; }
inline void setMyInt(int _value) { myInt = _value; }

private:
void initVariables();

QTimer *timer;

private slots:
void editVariables();

signals:
void myIntChanged();
};

#endif // MYCLASS_H

myclass.cpp

#include "myclass.h"

MyClass::MyClass(QObject *parent) : QObject (parent)
{
initVariables();

timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(editVariables()));
timer -> start(3000);
}

void MyClass::initVariables()
{
myInt = 0;
}

void MyClass::editVariables()
{
myInt = myInt + 1;

qDebug() << "myclass.cpp: timeout: variables edited.";
}

main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>

#include "myclass.h"

int main(int argc, char *argv[])
{
#if defined(Q_OS_WIN)
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
#endif

QGuiApplication app(argc, argv);

QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
if (engine.rootObjects().isEmpty())
return -1;

MyClass *myClass = new MyClass();
engine.rootContext() -> setContextProperty("_myClass", myClass);

return app.exec();
}

ma​​in.qml

import QtQuick 2.9
import QtQuick.Window 2.2

Window {
visible: true
width: 640
height: 480
title: qsTr("Exposed C++ Class")

Text {
anchors.top: parent.top; anchors.topMargin: 30
anchors.left: parent.left; anchors.leftMargin: 30
text: _myClass.myInt
}
}

最佳答案

问题是因为 load() 语句正在加载.qml文件,当读取它并验证变量是否存在时,他们意识到这个对象不存在,因为它被传递了通过 setContextProperty() 给他们,一个可能的解决方案是在加载 .qml 之前将对象传递给它:

int main(int argc, char *argv[])
{
#if defined(Q_OS_WIN)
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
#endif

QGuiApplication app(argc, argv);

QQmlApplicationEngine engine;
MyClass *myClass = new MyClass();
engine.rootContext()->setContextProperty("_myClass", myClass);
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
if (engine.rootObjects().isEmpty())
return -1;
return app.exec();
}

它没有更新是因为它没有通过你声明的信号通知它,正确的做法是每次属性改变时发出一个信号,你必须修改一些方法:

inline void setMyInt(int _value) {
if(myInt == _value)
return;
myInt = _value;
emit myIntChanged();
}

void MyClass::editVariables()
{
setMyInt(getMyInt()+1);
qDebug() << "myclass.cpp: timeout: variables edited.";
}

关于c++ - Qt:将 C++ 类暴露给 QML 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47940478/

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