QObject :: findChild()没有明显的原因返回None

时间:2014-03-06 19:59:19

标签: qt pyqt qml qt5 pyqt5

我是Qt Quck和Qt5 / PyQt的新手,现在我遇到了一个奇怪的问题。我正试图在下面的QML定义中找到一个objectName为“test”的对象,如下所示:

self.rootObject().findChild(QObject, "test")

但是呼叫返回None。但是,如果我将objectName: "test"属性移动到父Tab元素,则会成功找到它。它只在孩子Item内找不到。同样,addChannel也找不到modifyChannelremoveChannelfindChild()个对象。

import QtQuick 2.0
import QtQuick.Layouts 1.1
import QtQuick.Controls 1.1
import "TouchStyles"

Item {
    ListModel { }

    TouchButtonFlatStyle { id: touchButtonFlat }
    TouchTabViewStyle { id: touchTabView }

    Rectangle {
        width: 480
        height: 230

        TabView {
            currentIndex: 0
            tabPosition: 1
            anchors.fill: parent
            style: touchTabView

            Tab {
                title: "Play"

                Item {
                    anchors.fill: parent
                    PianoKeyboard { anchors.centerIn: parent }
                }
            }
            Tab {
                title: "Channels"
                Item {
                    objectName: "test"
                    ListView {
                        anchors.fill: parent
                        model: listModel
                        delegate: Channel {}
                    }
                    BorderImage {
                        border.bottom: 8
                        anchors.bottom: parent.bottom
                        source: "images/toolbar.png"
                        width: parent.width
                        height: 50

                        RowLayout {
                            anchors.verticalCenter: parent.verticalCenter
                            anchors.horizontalCenter: parent.horizontalCenter

                            Button { text: "Add"; objectName: "addChannel" }
                            Button { text: "Modify"; objectName: "modifyChannel" }
                            Button { text: "Remove"; objectName: "removeChannel" }
                        }
                    }
                }
            }
        }
    }
}

我做错了什么? Qt文档说,搜索是递归执行的。为什么不遍历整个对象树?

1 个答案:

答案 0 :(得分:3)

问题与选项卡仅在需要时“实例化”的事实有关。第一个选项卡始终是实例化的,因此如果您将objectName置于其中,则会找到它。

仅当您实例化第二个选项卡(选择它)时,才会在第二个选项卡中找到它。类似地,在findChild上使用TabView可能会实例化每个选项卡(因为它正在查找它们),因此即使没有选择第二个选项卡,findChild也可以工作。

结论:首先实例化所有标签(在findChild上执行TabView是单向但可能是黑客攻击),然后对项目执行findChild