2014-03-06 4 views
2

Я новичок в Qt Quck и Qt5/PyQt, и теперь у меня возникла странная проблема. Я пытаюсь найти объект с Objectname «тест» в приведенном ниже QML определение, как это:QObject :: findChild() возвращает None без видимой причины

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

Но вызов возвращает None. Однако, если я переместю свойство objectName: "test" в родительский элемент Tab, он будет найден успешно. В ребенке только не обнаружено Item. Аналогичным образом, addChannel, modifyChannel и removeChannel объекты также не найдены 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 на TabView в одном направлении, но может быть взломом), затем выполните findChild для элемента.

+0

Я выполняю 'findChild' в корневом элементе, чтобы найти TabView (найденный), а затем выполнить' findChild' в TabView, чтобы найти Tab (найденный), а затем выполнить 'findChild' на вкладке, чтобы найти кнопку (не найдена) , Проблема воспроизводится, если я запускаю ее на своем настольном ПК (ранее я тестировал ее на встроенной плате ARM). Таким образом, Tab не создается экземпляром 'findChild'. Кроме того, я посмотрел исходный код TabView, и я не нашел там никакой ленивой логики загрузки, кроме стиля TabView. Запуск 'findChildren (QObject)' на найденной вкладке возвращает двух дочерних элементов: QObject и QQmllComponent. – madprogrammer

+1

Решено путем подключения к событию 'onCurrentIndexChanged'' TabView'. После того, как событие будет запущено, получите 'currentIndex' активного' Tab', а затем, на основе индекса, вызывающего функцию для подключения к сигналам (теперь созданных экземплярами) 'Tab'. – madprogrammer

Смежные вопросы