我开始使用QtQuick Controls 2.0。我有使用C++的经验,也有少量使用Qt的经验,但是我以前从未使用过QML。

我有一个相互链接的TabBarSwipeView。我的意思是,当您在TabBar上选择一个页面时,SwipeView会转到该页面。当您从SwipeView滑动到页面时,TabBar会自动更新以反射(reflect)出来。

作为一项学习练习,我决定创建一个按钮,该按钮会将用户带到第二页。问题是,我似乎找不到不破坏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();
}

最佳答案

为了在不破坏currentIndex绑定(bind)的情况下移至下一页或上一页,可以分别调用 incrementCurrentIndex() decrementCurrentIndex() 。这些方法是在Qt 5.8的Qt Quick Controls 2.1中引入的。

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

Button {
    onClicked: tabBar.setCurrentIndex(1)
}

关于c++ - 转到特定页面后,如何将SwipeView的currentIndex设置为TabBar的currentIndex "by reference"?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43578012/

10-11 23:22