首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >访问QML组件的qml

访问QML组件的qml
EN

Stack Overflow用户
提问于 2016-04-08 12:04:33
回答 5查看 1.2K关注 0票数 3

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

代码语言:javascript
复制
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()
    }
}

MainScreen组件在MainScreen.qml文件中编写如下:

代码语言:javascript
复制
ControlView {
    id: mainScreenView
    objectName: "MainScreenView"


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

但是,这不像预期的那样工作,我得到了错误:

代码语言:javascript
复制
TypeError: Property 'doVideo' of object QQmlComponent is not a function

我认为问题在于,MainScreen的完整定义并没有在ApplicationWindow级别上看到。我试着看看我能不能投进去,但没有成功。

另外,mainScreen.objectName返回空字符串,而不是MainScreenView

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-04-08 13:13:52

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

main.qml

代码语言:javascript
复制
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来检查编译)

代码语言:javascript
复制
import QtQuick 2.5

Item {
    id: mainScreenView
    objectName: "MainScreenView"

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

另一个选项是创建组件动态

票数 5
EN

Stack Overflow用户

发布于 2016-09-13 10:23:22

而不是

属性组件主屏幕: MainScreen {}

使用

属性var主屏幕: MainScreen {}

这是示例代码

main.qml

代码语言:javascript
复制
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

代码语言:javascript
复制
import QtQuick 2.6

Item {
    id: mainScreenView
    objectName: "MainScreenView"

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

票数 2
EN

Stack Overflow用户

发布于 2016-04-08 13:31:26

我想你只是想要这样的东西:

代码语言:javascript
复制
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中:

代码语言:javascript
复制
import QtQuick 2.0
Item {
    function doSomething()
    {
        console.debug("Test")
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36499094

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档