2014-03-06 8 views
2

Qt Quck와 Qt5/PyQt를 처음 접했고 이상한 문제에 직면했습니다. 아래의 QML 정의에서 objectName "test"가있는 객체를 찾으려고합니다.QObject :: findChild()는 명백한 이유없이 None을 반환합니다.

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

그러나이 호출은 None을 반환합니다. 그러나 objectName: "test" 속성을 상위 Tab 요소로 이동하면 성공적으로 발견됩니다. 그것은 단지 어린이의 내부에서 whemm을 발견하지 않고있다 Item. 마찬가지로 addChannel, modifyChannelremoveChannel 개체도 findChild()에 의해 발견되지 않습니다.

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 문서는 검색이 재귀 적으로 수행된다고 말합니다. 왜 전체 객체 트리를 가로 지르지 않습니까?

+0

가장 좋은 방법은 먼저 C++에서 검색이 성공했는지 확인하는 것입니다. 그렇지 않으면 Qt 버그로보고하십시오. 그렇지 않으면 PyQt 버그가됩니다. –

+0

'self.rootObject(). findChildren (QObject)'(모든 자식)의 결과는 무엇입니까? –

+0

첫 번째 탭에서 동일한 작업이 수행됩니까 (두 번째 탭의 항목을 첫 번째 탭으로 복사하는 경우)? 또는 findChild를 수행하기 전에 두 번째 탭을 선택하면 같은 문제가 발생합니까? – Schollii

답변

3

문제는 탭이 필요할 때만 "인스턴스화"된다는 사실과 관련이 있습니다. 첫 번째 탭은 항상 인스턴스화되므로, objectName을 입력하면 해당 탭이 발견됩니다.

두 번째 탭을 인스턴스화하는 경우에만 두 번째 탭에서 찾을 수 있습니다 (선택). 마찬가지로, TabView에서 findChild을 사용하면 각 탭이 찾고 있기 때문에 두 번째 탭을 선택하지 않은 경우에도 findChild이 작동합니다.

결론 : 먼저 모든 탭을 인스턴스화하십시오 (TabViewfindChild을 해킹 일 수 있지만 편도 일 수 있음). 그런 다음 해당 항목에 대해 findChild을 수행하십시오.

+0

루트 요소에서'findChild'를 실행하여 TabView를 찾은 다음 발견 된 탭을 찾기 위해'findChild'를 실행 한 다음 탭에서'findChild'를 실행하여 찾을 수없는 버튼을 찾습니다. . 이 문제는 데스크톱 PC에서 실행하면 재현됩니다 (이전에 임베디드 ARM 보드에서 테스트 했었습니다). 따라서 Tab은'findChild'에 의해 인스턴스화되지 않습니다. 또한 TabView의 소스 코드를 살펴본 결과 TabView의 스타일을 제외하고는 게으른 로딩 로직을 찾지 못했습니다. 발견 된 Tab에서'findChildren (QObject)'를 실행하면 두 개의 자식 인 QObject와 QQmllComponent가 반환됩니다. – madprogrammer

+1

'TabView'의'onCurrentIndexChanged' 이벤트에 연결하면됩니다. 일단 이벤트가 발생하면 활성화 된'Tab'의'currentIndex'를 얻고, 인덱스를 기반으로 (현재 인스턴스화 된)'Tab' 자식들의 신호에 연결하는 함수를 호출합니다. – madprogrammer

관련 문제