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
?
完成后设置其
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());
如果您想在
objectName
而不是 QQuickPopupItem
上设置 QQuickContentItem
那么我认为您需要稍微修改一下接受的答案。您可以访问 PopupItem,因为它是 contentItem 的父级,因此:
Component.onCompleted: {
contentItem.parent.objectName = "foo"
}