Qt 如何在QML中动态创建弹出窗口

Qt 如何在QML中动态创建弹出窗口,qt,qml,qt5,qtquick2,Qt,Qml,Qt5,Qtquick2,当我尝试使用Qt.createQmlObject(…)或Qt.createComponent(…)动态创建弹出窗口时,出现异常: QML弹出窗口:找不到任何打开弹出窗口的窗口 这是我的密码: var popup1 = Qt.createQmlObject('import QtQuick 2.8; import QtQuick.Controls 2.1; Popup { id: popup; x: 100; y: 100; width: 200; height: 300; modal: true;

当我尝试使用Qt.createQmlObject(…)或Qt.createComponent(…)动态创建弹出窗口时,出现异常:

QML弹出窗口:找不到任何打开弹出窗口的窗口

这是我的密码:

var popup1 = Qt.createQmlObject('import QtQuick 2.8; import QtQuick.Controls 2.1; Popup { id: popup; x: 100; y: 100; width: 200; height: 300; modal: true; focus: true; closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutsideParent; visible: false }',
                                window,
                                "DynamicPopup");
popup1.open()

var popupComponent = Qt.createComponent("qrc:/TestPopup.qml")
var popup2 = popupComponent.createObject(window);
popup2.open()
TestPopup.qml:

import QtQuick.Window 2.2
import QtQuick.Controls 2.1

Popup {
    x: 100
    y: 100
    width: 200
    height: 300
    modal: true
    focus: true
    closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutsideParent
    visible: false
}

弹出窗口
不继承
QQuickItem
,默认情况下,它是
QML窗口
的父窗口,如果您使用的是
QQuickWidget
,则不会实例化。因此,应按如下方式传递父级:

var popupComponent = Qt.createComponent("qrc:/TestPopup.qml")
var popup2 = popupComponent.createObject(window, {"parent" : window});
popup2.open()

父元素必须是继承自
QQuickItem

例如:

import QtQuick 2.6
import QtQuick.Window 2.2
import QtQuick.Controls 2.1

Window {
    id: win
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    Row{
        Button{
            id: item1
            text: "btn1"
            onClicked: {
                var popup1 = Qt.createQmlObject('import QtQuick 2.8; import QtQuick.Controls 2.1; Popup { id: popup; x: 100; y: 100; width: 200; height: 300; modal: true; focus: true; closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutsideParent; visible: false }',
                                                item1,
                                                "DynamicPopup");
                popup1.open()

            }
        }

        Button{
            id: item2
            text: "btn2"
            onClicked: {
                var popupComponent = Qt.createComponent("qrc:/TestPopup.qml")
                var popup2 = popupComponent.createObject(item2);
                popup2.open()
            }

        }

    }
}
方法1:

方法2:


A
弹出窗口
需要作为
项的父项
窗口
不是父项。
您应该改用。

一种使用加载器动态加载弹出窗口的好方法:

Loader {
    id: popupLoader

    active: false
    source: "qrc:/TestPopup.qml"
    onLoaded: item.open()
}

function openMyPopup() {
    if( popupLoader.active )
        popupLoader.item.open()
    else
        popupLoader.active = true
}

@A.J,您的示例中的
窗口是什么?尝试将
弹出窗口
绑定到
QQuickItem
嗯,我的窗口是一个应用程序窗口。非常感谢你。