我开始使用QtQuick Controls 2.0。我有使用C++的经验,也有少量使用Qt的经验,但是我以前从未使用过QML。
我有一个相互链接的TabBar
和SwipeView
。我的意思是,当您在TabBar
上选择一个页面时,SwipeView
会转到该页面。当您从SwipeView
滑动到页面时,TabBar
会自动更新以反射(reflect)出来。
作为一项学习练习,我决定创建一个按钮,该按钮会将用户带到第二页。问题是,我似乎找不到不破坏TabBar
和SwipeView
之间的链接的方法。
以下代码是我想出的最好的代码。它可以正确转到第二页,并且当我使用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/