如何从 QML 为 PopupItem 设置 objectName?

How to set objectName for PopupItem from QML?

QML Popup 和派生控件正在创建一个 PopupItem 对象,它是它的可视化表示,但 Popup 本身是应用程序 contentData 的父级window。为 Popup 指定的 objectName 不适用于 PopupItem。例如下面的应用:

import QtQuick 2.12
import QtQuick.Controls 2.12

ApplicationWindow {
    visible: true
    width: 640
    height: 480
    title: qsTr("Popup Test")

    Button {
        text: "Open"
        onClicked: dummyPopup.open()
    }

    Popup {
        id: dummyPopup
        objectName: "dummyPopup"
        x: 100
        y: 100
        width: 200
        height: 300
        modal: true
        focus: true
    }
}

用空的 objectName 创建 PopupItem

有没有办法从 QML 为 PopupItem 设置 objectName

完成后设置其contentItemobjectName

import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Controls 2.12

ApplicationWindow {
    visible: true
    width: 640
    height: 480
    title: qsTr("Popup Test")

    Button {
        text: "Open"
        onClicked: dummyPopup.open()
    }

    Popup {
        id: dummyPopup
        objectName: "dummyPopup"
        x: 100
        y: 100
        width: 200
        height: 300
        modal: true
        focus: true

        Component.onCompleted: {
            contentItem.objectName = "foo"
            print(contentItem)
        }
    }
}

顺便说一下,如果这是用于自动测试,我有一个 hack in C++ 可以避免需要给 contentItem:

一个 objectName
QObject *TestHelper::findPopupFromTypeName(const QString &typeName) const
{
    QObject *popup = nullptr;
    foreach (QQuickItem *child, overlay->childItems()) {
        if (QString::fromLatin1(child->metaObject()->className()) == "QQuickPopupItem") {
            if (QString::fromLatin1(child->parent()->metaObject()->className()).contains(typeName)) {
                popup = child->parent();
                break;
            }
        }
    }
    return popup;
}

然后您可以在测试中使用该函数 like this

const QObject *newProjectPopup = findPopupFromTypeName("NewProjectPopup");
QVERIFY(newProjectPopup);
QTRY_VERIFY(newProjectPopup->property("opened").toBool());