gpt4 book ai didi

c++ - 在 qmlRegisterSingletonType 中使用非静态方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:20:43 34 4
gpt4 key购买 nike

我正在尝试使用非静态方法作为 Qt 5 中 qmlRegisterSingletonType 的回调方法。我的代码如下所示:

PersistentLong couponCounter("couponCounter", handler.getSubjectRunner(), handler.getDbManager());

qmlRegisterSingletonType<PersistentLong>("MyNamespace", 1, 0, "CouponCounter", couponCounter.factory);

但我得到以下编译器错误:

/.../src/Main.cxx: In function ‘int main(int, char**)’:
/.../src/Main.cxx:22:102: error: no matching function for call to ‘qmlRegisterSingletonType(const char [9], int, int, const char [14], <unresolved overloaded function type>)’
qmlRegisterSingletonType<PersistentLong>("MyNamespace", 1, 0, "CouponCounter", couponCounter.factory);
^
/.../src/Main.cxx:22:102: note: candidate is:
In file included from /usr/local/Qt-5.3.2/include/QtQml/QtQml:9:0,
from /.../src/Main.cxx:6:
/usr/local/Qt-5.3.2/include/QtQml/qqml.h:476:12: note: template<class T> int qmlRegisterSingletonType(const char*, int, int, const char*, QObject* (*)(QQmlEngine*, QJSEngine*))
inline int qmlRegisterSingletonType(const char *uri, int versionMajor, int versionMinor, const char *typeName,
^
/usr/local/Qt-5.3.2/include/QtQml/qqml.h:476:12: note: template argument deduction/substitution failed:
/.../src/Main.cxx:22:102: note: cannot convert ‘couponCounter.PersistentLong::factory’ (type ‘<unresolved overloaded function type>’) to type ‘QObject* (*)(QQmlEngine*, QJSEngine*)’
qmlRegisterSingletonType<PersistentLong>("MyNamespace", 1, 0, "CouponCounter", couponCounter.factory);

PersistentLongfactory 方法如下所示:

QObject * factory(QQmlEngine *engine, QJSEngine *scriptEngine) {
Q_UNUSED(engine)
Q_UNUSED(scriptEngine)

return this;
}

问题

关于为什么我不能将此方法用作 qmlRegisterSingletonType 的参数的任何想法?

有没有另一种方法可以在 QML 中将非静态实例注册为单例?

编辑 1

couponCounter 在 main() 中按以下方式构造:

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

QtSubjectHandler handler("burgundy_frontend");

PersistentLong couponCounter("couponCounter", handler.getSubjectRunner(), handler.getDbManager());

qmlRegisterSingletonType<PersistentLong>("MyNamespace", 1, 0, "CouponCounter", couponCounter.factory);
}

如果我使用函数指针,我如何在这个函数中引用 couponCounter

最佳答案

Any ideas as to why I can't use this method as argument to qmlRegisterSingletonType?

鉴于 factory 方法的用法,我可以猜测它是您用作回调的类的成员函数。但是,注册函数具有以下签名:

int qmlRegisterSingletonType(const char * uri, int versionMajor, int versionMinor, const char * typeName, QObject *(* ) ( QQmlEngine *, QJSEngine * ) callback)

如您所见,最后一个参数是一个函数指针,但您(试图)传递一个指向成员函数的指针 which is quite different .请注意,在这种情况下,friend 函数和 static 函数都不能被利用,因为它们都无法访问 this 指针。

Is there another way to register a non-static instance as a singleton in QML?

像这样编写和编译全局函数是完全可行的(static,你在哪里?):

QObject *provider(QQmlEngine *engine, QJSEngine *scriptEngine)
{
Q_UNUSED(engine)
Q_UNUSED(scriptEngine)
return new MyNiceObject();
}

然后像这样注册:

qmlRegisterSingletonType<AppInfo>("AppInfo", 1, 0, "AppInfo", provider);

Digia 示例使用此方法,除了我已删除的 static。不幸的是,文档非常模糊,没有提供使用 static 修饰符的具体原因,所以我能想到的唯一原因是 visibility目的。如果我错了,任何更知情/更熟练的人都可以纠正我,并告诉我们是否有更具体/更深思熟虑的原因(例如任何特定的内存管理原因)。

最后,重点是为 QML 引擎提供一个创建我们类型实例的函数,而这样的结果不能通过成员函数实现。

附带说明一下,如果你更愿意返回一个单例实例,你可以利用 singleton pattern (再次使用 static 修饰符)并像这样重写函数:

 QObject *provider(QQmlEngine *engine, QJSEngine *scriptEngine)
{
Q_UNUSED(engine)
Q_UNUSED(scriptEngine)
MyNiceObject * p = MyNiceObject::instance(); // uhmmmm static...
QQmlEngine::setObjectOwnership(p, QQmlEngine::CppOwnership);
return p;
}

请注意,创建对象的所有权默认授予QML 引擎。为避免此问题,可以使用 QQmlEngine::setObjectOwnership() 调用。

关于c++ - 在 qmlRegisterSingletonType 中使用非静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26760277/

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