我开始使用QtQuick Controls 2.0。我有使用C ++的经验和Qt的少量经验,但我之前没有使用过QML。
我有一个TabBar
和一个SwipeView
相互关联。我的意思是,当您在TabBar
上选择页面时,SwipeView
会转到该页面。当您从SwipeView
滑动到某个页面时,TabBar
会自动更新以反映该内容。
作为一项学习练习,我决定创建一个按钮,将用户发送到第二页。问题是我似乎无法在不弄乱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();
}
答案 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})
}
这将在分配静态值后恢复绑定。