7

QMLからのactivatedシグナルをPython3/PyQt5 (5.6) コードの装飾されたメソッドに接続したいと思います。 ListViewpyqtSlot

私の現在のアプローチは、コードに QML シーンをロードしてからQQmlApplicationEngine、を使用findChild()して my への参照を取得することListViewです。

問題は、のような QObject を検索するときに ListView しか見つからないことfindChild(QObject, 'myList')です。しかし、htis オブジェクトではシグナルにアクセスできません。activatedおそらく、このシグナルはQAbstractItemViewその子孫に対してのみ定義されているためです。

だから私が試してみるとfindChild(QListView, 'myList')、結果はNone. activatedそのため、信号に到達できません。これは PyQt5 のバグですか、それともこのシグナルに接続する別の方法はありますか?

ここにいくつかの最小限の作業例があります。

list.py:

import sys
from OpenGL import GL
from PyQt5.QtCore import QUrl, QObject
from PyQt5.QtWidgets import QApplication, QListView
from PyQt5.QtQml import QQmlApplicationEngine

# Main Function
if __name__ == '__main__':
    # Create main app
    app = QApplication(sys.argv)

    # Create QML engine
    engine = QQmlApplicationEngine(app)

    # Load the QML scene from file
    engine.load(QUrl('List.qml'))

    for root in engine.rootObjects():
        node = root.findChild(QListView, 'myList')
        if node:
            # At this point I would like to connect something to the
            # node.activated signal
            print(node)

    # Execute the application and exit
    sys.exit(app.exec_())

List.qml:

import QtQuick 2.0
import QtQuick.Window 2.2

Window {
  visibility: Window.FullScreen
  visible: true
  ListView {
    objectName: "myList"
    anchors.fill: parent
    delegate: Item {
      width: parent.width * 0.8
      height: 40
      Row {
        id: row1
        Rectangle {
          width: 40
          height: 40
          color: colorCode
        }

        Text {
          text: name
          font.bold: true
          anchors.verticalCenter: parent.verticalCenter
        }
        spacing: 10
      }
    }
    model: ListModel {
      ListElement {
        name: "Grey"
        colorCode: "grey"
      }

      ListElement {
        name: "Red"
        colorCode: "red"
      }

      ListElement {
        name: "Blue"
        colorCode: "blue"
      }

      ListElement {
        name: "Green"
        colorCode: "green"
      }
    }
  }

}
4

1 に答える 1