gpt4 book ai didi

c++ - QML 实例化 C++ 对象。我如何访问他们的方法?

转载 作者:行者123 更新时间:2023-11-30 03:18:27 29 4
gpt4 key购买 nike

这是我的 main.cpp 的样子:

int main(int argc, char **argv)
{
QGuiApplication app(argc, argv);
QCoreApplication::addLibraryPath("./");

QQuickView view;
view.setResizeMode(QQuickView::SizeRootObjectToView);
view.setSource(QUrl("qrc:/myqml.qml"));
view.show();

return app.exec();
}

如您所见,它从 myqml 创建内容。好吧,myqml 实例化了一个 C++ 类 MyClass

如何从对象 QQuickView view 访问此 C++ 方法?例如,我想做一些 view.MyClassInstance.myMethod1()

类型的事情

最佳答案

你想获得一个用C++在QML中创建的对象,这里不管目标是否有一个用C++创建的原型(prototype)。如果你想要这个,你必须通过 findChild 获得对象,因为在 QML 中创建的所有对象都与窗口有亲缘关系。

main.cpp

#include <QtQuick>
#include <QtGui>

class MyClass: public QObject
{
Q_OBJECT
public:
using QObject::QObject;
Q_INVOKABLE void invokable(){
qDebug()<< "invokable";
}
Q_SLOT void slot(){
qDebug()<< "slot";
}
void function(){
qDebug()<< "function";
}
};

int main(int argc, char *argv[])
{
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
qmlRegisterType<MyClass>("foo", 1, 0, "MyClass");
QGuiApplication app(argc, argv);

QQuickView view;
view.setResizeMode(QQuickView::SizeRootObjectToView);
view.setSource(QUrl(QStringLiteral("qrc:/main.qml")));
view.show();
if(MyClass* myclass_instance = view.findChild<MyClass *>("myclass_instance")){
myclass_instance->invokable();
myclass_instance->slot();
myclass_instance->function();
}
return app.exec();
}
#include "main.moc"

ma​​in.qml

import QtQuick 2.9
import foo 1.0

Rectangle {
color: "salmon"
width: 640
height: 480
MyClass{
objectName: "myclass_instance"
}
}

但这种方法有几个缺点,例如谁管理对象的生命周期是 QML,而不是 C++,因此指针可能在某个时候指向一个未保留的地址。另一个缺点是 C++ 对 QML 有依赖性,因为如果在 QML 中更改 objectName,则必须更改 C++ 中的代码。


另一种方法是创建一个辅助类,该类使用 setContextProperty() 导出到 QML 并与 MyClass 对象交互。

main.cpp

#include <QtQuick>
#include <QtGui>

class MyClass: public QObject
{
Q_OBJECT
public:
using QObject::QObject;
Q_INVOKABLE void invokable(){
qDebug()<< "invokable";
}
Q_SLOT void slot(){
qDebug()<< "slot";
}
void function(){
qDebug()<< "function";
}
};

class Helper: public QObject
{
Q_OBJECT
public:
using QObject::QObject;
void call_function(){
emit called();
}
Q_SIGNAL void called();
};

int main(int argc, char *argv[])
{
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
qmlRegisterType<MyClass>("foo", 1, 0, "MyClass");
QGuiApplication app(argc, argv);

Helper helper;

QQuickView view;
view.rootContext()->setContextProperty("helper", &helper);
view.setResizeMode(QQuickView::SizeRootObjectToView);
view.setSource(QUrl(QStringLiteral("qrc:/main.qml")));
view.show();

helper.call_function();
return app.exec();
}
#include "main.moc"

ma​​in.qml

import QtQuick 2.9
import foo 1.0

Rectangle {
color: "salmon"
width: 640
height: 480
MyClass{
id: myclass
}
Connections{
target: helper
onCalled:{
myclass.invokable()
myclass.slot()
}
}
}

这种方法的优点是C++和QML的逻辑之间没有依赖性,而且由于myclass对象不是直接在QML中处理,因此生命周期不会产生问题。缺点是代码多了一点,只能调用Q_INVOKABLE或Q_SLOT。

关于c++ - QML 实例化 C++ 对象。我如何访问他们的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54739100/

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