如何从 QML 设置 PopupItem 的 objectName?

问题描述 投票:0回答:2

QML Popup 和派生控件正在创建一个

PopupItem
对象,它是它的视觉表示,但
Popup
本身是应用程序窗口
contentData
的父级。为
objectName
指定的
Popup
不适用于
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
    }
}

创建带有空

PopupItem
objectName

有没有办法从 QML 设置

objectName
PopupItem

qt popup qml
2个回答
3
投票

完成后设置其

objectName
contentItem

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)
        }
    }
}

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

objectName
提供
contentItem

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;
}

然后您可以在测试中像这样使用该函数:

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

0
投票

如果您想在

objectName
而不是
QQuickPopupItem
上设置
QQuickContentItem
那么我认为您需要稍微修改一下接受的答案。您可以访问 PopupItem,因为它是 contentItem 的父级,因此:

        Component.onCompleted: {
            contentItem.parent.objectName = "foo"
        }
© www.soinside.com 2019 - 2024. All rights reserved.