Tal*_*ion 6 c++ qt abstract-class qml
我正在写一个Qt应用程序.
我将我的应用程序分离为QML前端和C++插件后端.
在我的C++插件中,我有一个Session抽象类,我想向QML公开,我也有一些该类的实现.
我希望我的QML前端只知道Session类,而不是被它的哪种会话的具体细节所困扰.
我尝试了qmlRegister*的一些变体来用QML注册我的Session类型,但是Session需要具体(如在qmlRegisterType的情况下)或者它注册正常但是我根本无法在property Session session没有实例化Session的情况下从QML引用Session类型来自QML.
有谁知道我应该怎么做?
更新:
一个不起作用的例子:
在main.cpp中:
char const* const uri = "com.nogzatalz.Downow";
qmlRegisterUncreatableType<downow::Session>(uri, 1, 0, "Session", "Abstract type");
Run Code Online (Sandbox Code Playgroud)
在DowNow.qml中:
import QtQuick 2.0
import com.nogzatalz.Downow 1.0
Item {
property Session session
}
Run Code Online (Sandbox Code Playgroud)
小智 0
据我所知,不可能使用抽象类作为定义来创建变量。
您可以在 qml 代码中将会话变量声明为 QtObject,您将失去 qtcreator 的自动完成功能。
然而,所有使用 Q_PROPERTY 宏声明的属性和所有 Q_INVOKABLE 函数在运行时仍然可用。
如果您想拥有几乎相同的语义,我建议您创建一个单例 C++ 类,使用 qmlRegisterSingletonType 注册到 QML,并让该类携带“会话”变量。然后将 qmlRegisterUncreatableType 保留在您的 Session 抽象类上,这样在 qml 代码中您将能够编写如下内容:
MySingleton.session
Run Code Online (Sandbox Code Playgroud)
并在 qtcreator 中保留 qml 的自动完成功能。
作为奖励,如果您的用户可以多次登录/注销而无需重新启动应用程序,您还可以创建一个信号“SessionChanged”。