2017-07-13 17 views
-1

私はJavaScript式(currentContainer)によって定義されたプロパティを持つ:QmlのJavaScriptバインディングのイベントが変更されましたか?

Item { 
    id: theContainer 

    property alias currentIndex: theListView.currentIndex 
    signal onCurrentIndexChanged() 

    property MyCustomCppContainer currentContainer: { 
     if(theListView.currentIndex >= 0) 
      theModel.getCustomContainer(theListView.currentIndex) 
     else 
      null 
    } 
    signal onCurrentContainerChanged() // nobody calls this signal (yet) 

    MyCustomCppModel { 
     id: theModel 
    } 

    ListView { 
     id: theListView 

     anchors.fill: parent 

     model: theModel 
     currentIndex: -1 
     onCurrentIndexChanged: theContainer.onCurrentIndexChanged() 

     /* Other properties stripped for example */ 
    } 
} 

悲しいことに、私はいつも最後に選択されたコンテナではなく、現在選択されている1取得:

ContainerItem { 
    onCurrentIndexChanged: { 
     //On first change, currentContainer is null 
     //though the first one was selected 

     //After selecting the second entry 
     //I get the result I expected last time 

     console.log(currentContainer.name); 
    } 
} 

を、私は解決策を考えますcurrentContaineronCurrentContainerChanged()の別の信号を持つことになります。

しかし、誰がこの特別な信号を呼び出しますか?

+0

信号onCurrentContainerChanged(ハンドラ:onOnCurrentContainerChanged)とハンドラonCurrentIndexChanged(ハンドラonOnCurrentIndexChanged)は、どのように使用しますか? – derM

+0

現在選択されているアイテムに応じてインタラクティブマップを変更したいと考えています。マップ自体はカスタムQPainterベースのアイテムです。ハイライトを追加したり削除したりするメソッドしかサポートしていないので、単にデータバインディングをここで使用することはできません。 –

+0

あなたはバインディングでコードをデバッグしようとしました: 'property MyCustomCppContainer currentContainer:[...]' with console.log(...) – derM

答えて

0

私はC++ヘルパークラスを使用してこの問題を解決することができます:

class PropertyChangedHelper : public QObject 
{ 
    Q_OBJECT 
    Q_PROPERTY(QVariant theProperty WRITE setTheProperty NOTIFY thePropertyChanged) 

public: 
    PropertyChangedHelper(QObject* parent = nullptr) : QObject(parent) {} 
    virtual ~PropertyChangedHelper() {} 

    void setTheProperty(QVariant) { 
     Q_EMIT thePropertyChanged(); 
    } 

Q_SIGNALS: 
    void thePropertyChanged(); 

private: 
    Q_DISABLE_COPY(PropertyChangedHelper) 
}; 

使い方は非常に簡単です:

PropertyChangedHelper { 
    theProperty: containerItem.currentContainer 
    onThePropertyChanged: { 
     console.log(containerItem.currentContainer.name); 
    } 
} 

は、私は、これは任意のQML/QtQuick理念に違反するかどうかわからないのですが、それは動作します。

+0

あなたはこれを行うかもしれませんが、QMLで直接行うことができます- なぜ? – derM

+0

多分あなたはこれを読むべきです:http://doc.qt.io/qt-5/qtqml-syntax-objectattributes.html#property-attributes - あなたが作成するそれぞれのプロパティに対して、 '[プロパティ]変更された'信号は暗黙的に作成した。対応するハンドラは常にそうです: 'on [Property] Changed' – derM

+0

ああ、私はそれを逃しました! QtCreatorが正しく自動完成しなかったので、私は信号がないと思った。あなたはあなたのコメントで私の質問に答えました! –

関連する問題