我正在将QQmlComponent *传递给QML作为QVariant::fromValue(comp)

请注意,无论如何QQmlComponent doesn't have any method createObject()

但是在QML中,它可以工作:

qqmlcompPtr.createObject(p)

在传递QQmlComponent *的情况下,QML引擎是否可能会进行一些隐式转换?因为这是QML的Component元素的一种方法。

我没有注意到article on implicit conversions between C++ and QML中提到了这一点

最佳答案

看一看QQmlComponent.cpp,它实际上包含一个createObject()方法,但是它是一个 protected 方法,因此它可能未被记录。

// QQmlComponent.cpp
void QQmlComponent::createObject(QQmlV8Function *args)
{
    Q_D(QQmlComponent);
    Q_ASSERT(d->engine);
    Q_ASSERT(args);
    ...

尽管它是 protected ,但它也被声明为Q_INVOKABLE,因此可以从QML调用它。我猜它是 protected 方法的原因是,它是从QML的JavaScript而不是从C++调用的。
// QQmlComponent.h
protected:
    QQmlComponent(QQmlComponentPrivate &dd, QObject* parent);
    Q_INVOKABLE void createObject(QQmlV8Function *);
    Q_INVOKABLE void incubateObject(QQmlV8Function *);

10-06 05:17