0

我有一个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 一样注册和更新?

4

0 回答 0