6

QtQuick Controls 2.0 を使い始めています。私は C++ の経験があり、Qt の経験も少しありますが、QML を使用したことはありません。

互いにリンクされている と がありますTabBarSwipeViewこれが意味することは、 でページを選択するとTabBarSwipeViewがそのページに移動するということです。からページにスワイプするとSwipeViewTabBarがそれを反映して更新されます。

学習課題として、ユーザーを 2 番目のページに移動させるボタンを作成することにしました。TabBar問題は、と の間のリンクを台無しにせずにそうする方法を見つけることができないように見えることですSwipeView

次のコードは、私が思いついた最高のものです。2 番目のページに正しく移動し、現在のページを変更してTabBarSwipeViewまだ更新されます。ただし、新しいページにスワイプTabBarしても、 . tabBar.currentIndexコロンを使用して初期化を行った場合、への設定は参照による設定のswipeView.currentIndex効果しかないようです。等号を使用すると、値によって設定されます。不変条件を維持しながら特定のページに移動するにはどうすればよいswipeView.currentIndex == tabBar.currentIndexですか?

// main.qml
import QtQuick 2.7
import QtQuick.Controls 2.0
import QtQuick.Layouts 1.0

ApplicationWindow {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")
    SwipeView {
        id: swipeView
        anchors.fill: parent
        currentIndex: tabBar.currentIndex

        Page {
            Button {
                text: qsTr("Continue to Page 2")
                onClicked: {
                    tabBar.currentIndex = 1;
                    // this next line merely sets tabBar.currentIndex to 1
                    tabBar.currentIndex = swipeView.currentIndex
                }
                anchors.centerIn: parent
                width: text.implicitWidth
                height: text.implicitHeight
            }
        }

        Page {
            Label {
                text: qsTr("Second page")
                anchors.centerIn: parent
            }
        }
    }

    footer: TabBar {
        id: tabBar
        currentIndex: swipeView.currentIndex
        TabButton {
            text: qsTr("First")
        }
        TabButton {
            text: qsTr( "Second")
        }
    }
}

C++ コードは、Qt Creator が私に提供したデフォルトです。

// main.cpp
#include <QGuiApplication>
#include <QQmlApplicationEngine>

int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;
    engine.load(QUrl(QLatin1String("qrc:/main.qml")));

    return app.exec();
}
4

2 に答える 2

2

Signalsを探している可能性があります。Qtのドキュメントから:

プロパティ変更シグナルハンドラ

QML プロパティの値が変更されると、シグナルが自動的に発行されます。このタイプのシグナルはプロパティ変更シグナルであり、これらのシグナルのシグナル ハンドラはon<Property>Changedの形式で記述されます 。<Property>はプロパティの名前で、最初の文字が大文字になります。

したがって、あなたの例では:

SwipeView {
    id: swipeView
    ...
    currentIndex: tabBar.currentIndex
    onCurrentIndexChanged: {
        tabBar.currentIndex = currentIndex
    }
...
footer: TabBar {
    id: tabBar
    currentIndex: swipeView.currentIndex
    onCurrentIndexChanged: {
        swipeView.currentIndex = currentIndex
    }
    ...

そうすれば、どちらかの currentIndex を設定するだけで、シグナル ハンドラによって「リンク」されたままになるので安心できます。

編集:

jpnurmi で指摘されてQt.bindingいるように、次のように使用することもできます。

onClicked: {
    swipeView.currentIndex = 1;
    swipeView.currentIndex = Qt.binding(function() {return tabBar.currentIndex})
}

これにより、静的な値が割り当てられた後にバインディングが復元されます。

于 2017-04-24T00:27:30.030 に答える