如何在转到特定页面后将SwipeView的currentIndex设置为TabBar的currentIndex“by reference”?

时间:2017-04-24 00:27:30

标签: c++ qt qml qtquick2 qtquickcontrols2

我开始使用QtQuick Controls 2.0。我有使用C ++的经验和Qt的少量经验,但我之前没有使用过QML。

我有一个TabBar和一个SwipeView相互关联。我的意思是,当您在TabBar上选择页面时,SwipeView会转到该页面。当您从SwipeView滑动到某个页面时,TabBar会自动更新以反映该内容。

作为一项学习练习,我决定创建一个按钮,将用户发送到第二页。问题是我似乎无法在不弄乱TabBarSwipeView之间的链接的情况下找到方法。

以下代码是我提出的最好的代码。它正确地转到第二页,当我使用TabBar更改当前页面时,SwipeView仍会更新。但是,刷卡到新页面不再更新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();
}

2 个答案:

答案 0 :(得分:4)

要在不中断currentIndex绑定的情况下移至下一页或上一页,您可以分别致电incrementCurrentIndex()decrementCurrentIndex()。这些方法在Qt 5.8中的Qt Quick Controls 2.1中引入。

鉴于currentIndex setter aka。 QQuickContainer::setCurrentIndex()是一个广告位,您也可以从QML调用setCurrentIndex()来跳转到任意页面。这也不会破坏现有的绑定。

Button {
    onClicked: tabBar.setCurrentIndex(1)
}

答案 1 :(得分:2)

您可能正在寻找Signals。从Qt文档:

  

属性更改信号处理程序

     

当QML属性的值时,会自动发出信号   变化。这种类型的信号是属性改变信号和信号   这些信号的处理程序以 on&lt; Property&gt; Changed 的形式写入   其中&lt; Property&gt; 是属性的名称,第一个字母   大写。

因此,对于你的例子:

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

这样你就可以简单地设置其中任何一个的currentIndex,并确保它们将因信号处理程序而保持“链接”。

编辑:

As pointed out by jpnurmi,你也可以这样使用Qt.binding

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

这将在分配静态值后恢复绑定。