2

カスタムデリゲートを使用して QML に ListView アイテムがあります。

Component{


    id: contactDelegate

    Item
    {
        id: wrapper;
        width: 306; height: 40

        FlipableImage
        {
            id: flipableImage
            width: 30
            height: 30

            anchors.verticalCenter: wrapper.verticalCenter;
            anchors.left:  wrapper.left
            anchors.leftMargin: 10

            frontImage: serverIconSource;
            backImage: "qrc:/images/resources/images/log.png";
        }

        Column
        {
            anchors.left: flipableImage.right
            anchors.leftMargin: 10
            Text
            {
                font.family: helveticaNeueBoldFont.name
                font.pixelSize: 14
                text: serverName;
            }

            Text
            {
                font.family: helveticaNeueFont.name
                font.pixelSize: 14
                text: serverLogin;
            }
        }

        ConnectionStateImage
        {
            id: stateImage
            state: "noState"
            anchors.verticalCenter: parent.verticalCenter;
            anchors.right: wrapper.right
            anchors.rightMargin: 10
            visible: itemMouseArea.containsMouse;
        }

        MouseArea
        {
            id: mouseArea;
            anchors.fill: flipableImage
            hoverEnabled: true;
            z: 1
            onEntered:
            {
                flipableImage.flipped = !flipableImage.flipped;
            }
            onExited:
            {
                flipableImage.flipped = !flipableImage.flipped;
            }
        }
    }
}

マウス ホバーすると、flipableImage が反転します。しかし、モデルまたはQDeclarativeViewからのイベントで手動で反転する必要があります。FlipableImage のプロパティを変更するためにリスト ビューで項目に移動する方法。私にとって、qml や C++ からナビゲートすることは重要ではありません。どうも。

4

2 に答える 2

2

QML リスト ビュー要素の特別なプロパティの 1 つは、一度に表示されるデリゲート アイテムのみを作成することです。ビューポートの外に出るとすぐに、それらは破棄されます。

したがって、ソース モデルの 1 つを表す 1 つの特定のアイテムが特定の時点で実際に存在するかどうかを知る方法はありません。それが要素のitemAt(index)ようなメソッドがない理由でもあります。Repeater

問題を解決する最善の方法は、デリゲート コンポーネント自体で宣言的に解決することです。

  • マウス領域での明示的な割り当てを削除しflipableImage.flippedます。実際、すべてのイベント ハンドラーはまったく必要ありません。

  • アイテムが強制的に反転されるかどうかを示すブール値プロパティをコンポーネントに与え、実際のロジックに応じてリスト ビューでプロパティの値を割り当てます。上記の理由から、これも宣言的に行う必要があります。index適切な戦略は、インデックスを保持する変数に対してプロパティを比較することです。

  • 最後に、フリップされた状態を宣言的に計算します。

    Item {
         id: wrapper
         property bool manuallyFlipped: false       
         /* ... */
         FlipableImage {
             /* ... */
             flipped: mouseArea.containsMouse || wrapper.manuallyFlipped
         }
         /* ... */
    }
    
于 2013-01-04T17:36:14.263 に答える
1

もし私があなたなら、QMLデリゲートでアイテムの状態を保持することはありません。から独自のモデルを派生QAbstractListModelさせ、C ++からQMLに公開して、そこにあるアイテムの状態を保持します。モデルを公開する方法はここに書かれています。リスト内のアイテムの値を設定するには、モデルクラスのQML C ++メソッドにエクスポートする必要があります。これは、QMLでの割り当てによってアイテムモデルの値を設定できないためです(少なくとも私が覚えている限り)。

MouseArea {
//...
    onEntered {
        myModel.itemAtIndexEntered(currentIndex);
    }
//...
}

C ++関数をqmlにエクスポートするには、それらをスロットとして作成するかQ_INVOKABLE、宣言に追加する必要があります。詳細については、こちらをご覧ください。

于 2013-01-04T18:54:05.570 に答える