- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试使用非静态方法作为 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);
PersistentLong
的factory
方法如下所示:
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/
我正在尝试使用非静态方法作为 Qt 5 中 qmlRegisterSingletonType 的回调方法。我的代码如下所示: PersistentLong couponCounter("couponC
我想在 QML 中使用 C++ 类作为 Singleton 实例,并认为我必须使用 qmlRegisterSingletonType 注册它们。此函数需要一个提供已注册 C++ 类实例的函数。我在 W
在我的主 QML 文件中,我定义了一个 MediaPlayer .要对媒体缓冲区进行低级别访问(通过 QAudioProbe),我需要获取对其 mediaObject 的引用.我的 C++ 后端通过
当我想向 QML 接口(interface)公开 C++ 时。 qmlRegisterSingletonType("Test", 1, 0, "Interface",
我是一名优秀的程序员,十分优秀!