QML访问您的QML组件

4

我正在使用QML开发前端,并且在访问我的主QML窗口中的一个组件时遇到了问题。因此,我的主QML窗口如下所示:

ApplicationWindow {
    id: rootWindow
    objectName: "window"

    property Component mainScreen: MainScreen {} // my component

    // This is a slot that gets called from C++ side.
    // The function gets called fine.
    function videoDone() {
        mainScreen.doVideo()
    }
}

组件MainScreenMainScreen.qml文件中编写如下:

ControlView {
    id: mainScreenView
    objectName: "MainScreenView"


    function doVideo() {
        console.log("Called")
    }
}

然而,这并没有按照预期工作,我收到了以下错误信息:
TypeError: Property 'doVideo' of object QQmlComponent is not a function

我认为问题在于在ApplicationWindow级别没有看到MainScreen的完整定义。我试图查看是否可以进行强制转换,但没有成功。
此外,mainScreen.objectName返回一个空字符串而不是MainScreenView
5个回答

6

我认为正确使用MainScreen组件的方法应该是像这样做:

main.qml

import QtQuick 2.5
import QtQuick.Controls 1.4

ApplicationWindow {
    id: rootWindow
    objectName: "window"
    visible: true

    MainScreen { id: mainScreen } // my component

    Component.onCompleted: {
        mainScreen.doVideo()
    }
}

MainScreen.qml(与您的代码相同,但我使用了Item而不是ControlView来检查编译)

主屏幕.qml
import QtQuick 2.5

Item {
    id: mainScreenView
    objectName: "MainScreenView"

    function doVideo() {
        console.log("Called")
    }
}

另一个选项是动态创建组件。请参考createComponent方法

就是这样了!谢谢! - Luca
@Luca 太棒了! :D 感谢你。愉快的编程! :) - Tarod

2

Property Component mainscreen: MainScreen { }

替换为

Property var mainscreen: MainScreen { }

以下是示例代码

main.qml

import QtQuick 2.6
import QtQuick.Controls 1.5

ApplicationWindow {
    id: rootWindow
    objectName: "window"
    visible: true

    property var mainScreen: MainScreen {  }

    Component.onCompleted: {
        mainScreen.doVideo()
    }
}

MainScreen.qml

import QtQuick 2.6

Item {
    id: mainScreenView
    objectName: "MainScreenView"

    function doVideo() {
        console.log("Called")
    }
}


1
我猜您想要这样的东西:

我猜您只是想要这样的东西:

ApplicationWindow {
    // if you really need a property of your Item uncomment the following line:
    // property alias mainScreen : mainScreen

    MainScreen {
        id: mainScreen
    }
    function videoDone() {
        mainScreen.doSomething()
    }
}

在MainScreen.qml中:
import QtQuick 2.0
Item {
    function doSomething()
    {
        console.debug("Test")
    }
}

0

您应该为您的组件分配一个ID。

ApplicationWindow {

id: rootWindow
objectName: "window"

property Component mainScreen: MainScreen {
    id: myMainScreenCmp
 } // my component

function videoDone() {
    myMainScreenCmp.doVideo()
}

}


-1

你必须导入你的组件,而且你的组件名称和文件名必须相同。

MainScreen.qml

MainScreen {
    id: mainScreenView
    objectName: "MainScreenView"

    function doVideo() {
        console.log("Called")
    }
}

我不理解。如果我这样做,就会出现“MainScreen”被递归实例化的错误。 - Luca

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接