2016-07-14 11 views
6

私は私ののpython3/PyQt5(5.6)コードからpyqtSlot飾ら方法にQMLListViewからactivated信号を接続したいと思います。PyQt5 pyqtSlotをQML ListView信号に接続するにはどうすればよいですか?

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

問題は、findChild(QObject, 'myList')のようなQObjectを検索するときにListViewしか見つからないということです。しかし、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" 
     } 
    } 
    } 

} 

答えて

1

あなたはQQuickView代わりのQQmlApplicationEngineを使用していることを行うことができます。

QQuickViewから継承する新しいクラスを追加するようにpythonスクリプトを変更し、 "myList"という名前のQMLオブジェクトに信号を追加しました。

また、QMLには、タイプのWindowタイプが削除されました(をQQuickViewと使用することはできません)。アプリケーションをフルスクリーンで表示したい場合は、それをMyViewクラスに指定する必要があります。 この例では、色の付いた四角形のいずれかをクリックすると、インデックスがコンソールに表示されます。

list.py:

import sys 
from PyQt5.QtCore import QUrl, QObject 
from PyQt5.QtWidgets import QApplication, QListView 
from PyQt5.QtQuick import QQuickView, QQuickItem 

class MyView(QQuickView): 
    def __init__(self, parent=None): 
     super().__init__(parent) 
     # Load the QML scene from file 
     self.setSource(QUrl('List.qml'))  
     #connect signal and source 
     list = self.rootObject().findChild(QQuickItem, 'myList') 
     list.mySignal.connect(self.mySlot) 

    def mySlot(self, index): 
     print(index) 

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

    # Create QML view 
    view = MyView() 
    view.show()  

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

List.qml:

import QtQuick 2.0 
import QtQuick.Window 2.2 

Item { 
    width: 500 
    height: 500 
    ListView { 
    anchors.fill: parent 
    id: list 
    objectName: "myList" 
    signal mySignal(int index) 
    delegate: Item { 
     width: parent.width * 0.8 
     height: 40 
     Row { 
     id: row1 
     Rectangle { 
      width: 40 
      height: 40 
      color: colorCode 

      MouseArea{ 
      anchors.fill: parent 
      onClicked: list.mySignal(index) 
      } 
     } 

     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" 
     } 
    } 
    } 

} 
関連する問題