我有一个MyQuickItem派生自QQuickItem以下的类
// MyQuickItem.hpp
class MyQuickItem : public QQuickItem {
Q_OBJECT
public:
MyQuickItem();
virtual ~ MyQuickItem();
protected:
QSGNode* updatePaintNode(QSGNode *, UpdatePaintNodeData *) override;
};
以下是MyQuickItem.qml.
import QtQuick 2.0
import MyQuickItem 1.0
Item {
MyQuickItem {
id: my_quick_item
objectName: "MyQuickItemObject"
visible: false
}
}
需要注意的是,以上所有 C++ 和 qml 代码都在一个单独的静态库中。图书馆里有qrc一个MyQuickItem.qml。这个库也可以访问QQmlApplicationEngine应用程序的全局对象。
我的问题:如何从我的库中加载,以便它像应用程序中的其他 sMyQuickItem一样在 QML 中注册?QQuickItemmain.qml
在应用程序加载 main.qml 之后调用的 C++ 方法中,我正在我的库中尝试以下方式:
MyQuickItem * myItem = new MyQuickItem();
myItem->setParent(m_qml_engine->parent());
myItem->setParentItem(qobject_cast<QQuickItem*>(m_qml_engine->parent()));
QQmlEngine::setObjectOwnership(myItem, QQmlEngine::JavaScriptOwnership);
myItem->setHeight(500); // But myItem is NULL here !!!
myItem->setHeight(500); // But myItem is NULL here !!!
首先,我不知道如何链接QUrl(QStringLiteral("qrc:/qml/MyQuickItem.qml"))到myItem指针。
其次,执行上述操作似乎无法MyQuickItem 正确加载,因为我没有接到updatePaintNode我已覆盖的呼叫。我需要Qt/QML窗口系统来调用我MyQuickItem::updatePaintNode的,因为我在那里有重要的逻辑。
那么,我怎样才能MyQuickItem从我的库中正确加载,以便它像其他QQuickItems 一样注册和更新?