英文:
How to center ScrollView that is in StackView?
问题
我无法将推送的ScrollView居中到StackView中。我尝试了很多方法,但都不起作用。你能帮我解决这个问题吗?
//Main.qml
...
StackView {
id: stackView
anchors.fill: parent
initialItem: mainView
}
Loader {
id: serialportLoader
active: false
source: "secondFile.qml"
}
...
//通过按下一个按钮将"secondFile.qml"推送
Action {
id: openSerialportSettings
text: "Open serial port"
onTriggered: {
serialportLoader.active = true;
stackView.push(serialportLoader.item);
}
}
...
//secondFile.qml
ScrollView {
ColumnLayout {
spacing: 5
anchors.centerIn: parent
Rectangle {
color: "green"
height: 50
Layout.fillWidth: true
}
...
如果我向ScrollView添加一个空的Item,它会居中,但无法滚动:
ScrollView {
Item {
}
ColumnLayout {
...
我猜我可能是在错误地使用ScrollView,因为我用ScrollView和Page代替它时得到这些结果:
ScrollView/*Page*/ {
id: topItem
ColumnLayout {
spacing: 5
anchors.centerIn: parent
Rectangle {
color: "green"
height: 200
width: 300
Layout.fillWidth: true
}
}
}
[1]: https://i.stack.imgur.com/z7ndt.png
[2]: https://i.stack.imgur.com/VlQRg.png
[3]: https://i.stack.imgur.com/bzOgY.png
英文:
I can't center pushed ScrollView into the StackView. I've tried a bunch of ways, but nothing works. Can you help me with this, please?
//Main.qml
...
StackView {
id: stackView
anchors.fill: parent
initialItem: mainView
}
Loader {
id: serialportLoader
active: false
source: "secondFile.qml"
}
...
//Push "secondFile.qml" by pressing a button with the action:
Action {
id: openSerialportSettings
text: "Open serial port"
onTriggered: {
serialportLoader.active = true;
stackView.push(serialportLoader.item);
}
}
...
//secondFile.qml
ScrollView {
ColumnLayout {
spacing: 5
// Layout.alignment: Qt.AlignVCenter
anchors.centerIn: parent
Rectangle {
color: "green"
height: 50
Layout.fillWidth: true
}
...
If I add an empty Item to the ScrollView, it comes to the center but no longer scrollable:
ScrollView {
Item {
}
ColumnLayout {
...
I guess I'm just using ScrollView wrong, because I get these results with ScrollView and Page instead of it:
ScrollView/*Page*/ {
id: topItem
ColumnLayout {
spacing: 5
anchors.centerIn: parent
Rectangle {
color: "green"
height: 200
width: 300
Layout.fillWidth: true
}
}
}
答案1
得分: 1
正如JarMan所暗示的,问题/混淆的原因是你的Loader实现使得你的StackView实现变得模糊不清。我已经创建了一个版本的你的应用程序,只使用了StackView,并让它接收"SecondPage.qml":
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
Page {
header: AppToolBar { }
StackView {
id: stackView
anchors.fill: parent
initialItem: "MainView.qml"
}
}
// MainView.qml
import QtQuick
import QtQuick.Controls
Page {
Label {
anchors.centerIn: parent
text: "MainView.qml"
}
Button {
anchors.horizontalCenter: parent.horizontalCenter
y: parent.height * 3 / 4
text: "Go To Second Page"
onClicked: stackView.push("SecondPage.qml")
}
}
// SecondPage.qml
import QtQuick
import QtQuick.Controls
Page {
Label {
anchors.centerIn: parent
text: "SecondPage.qml"
}
Button {
anchors.horizontalCenter: parent.horizontalCenter
y: parent.height * 3 / 4
text: "Back"
onClicked: stackView.pop()
}
}
// AppToolBar.qml
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
ToolBar {
RowLayout {
width: parent.width
ToolButton {
enabled: stackView.depth > 1
icon.source: "chevron-left-32.svg"
opacity: enabled ? 1 : 0
onClicked: stackView.pop()
}
Label {
Layout.fillWidth: true
text: "Page Title"
horizontalAlignment: Qt.AlignHCenter
}
ToolButton {
icon.source: "handle-vertical-32.svg"
}
}
}
// chevron-left-32.svg: https://raw.githubusercontent.com/Esri/calcite-ui-icons/master/icons/chevron-left-32.svg
// handle-vertical-32.svg: https://raw.githubusercontent.com/Esri/calcite-ui-icons/master/icons/handle-vertical-32.svg
你可以在线试用!
英文:
As hinted by JarMan, the cause of the problem/confusion is your implementation of Loader makes your StackView implementation ambiguous. I have created a version of your application just using the StackView and made that receive "SecondPage.qml":
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
Page {
header: AppToolBar { }
StackView {
id: stackView
anchors.fill: parent
initialItem: "MainView.qml"
}
}
// MainView.qml
import QtQuick
import QtQuick.Controls
Page {
Label {
anchors.centerIn: parent
text: "MainView.qml"
}
Button {
anchors.horizontalCenter: parent.horizontalCenter
y: parent.height * 3 / 4
text: "Go To Second Page"
onClicked: stackView.push("SecondPage.qml")
}
}
// SecondPage.qml
import QtQuick
import QtQuick.Controls
Page {
Label {
anchors.centerIn: parent
text: "SecondPage.qml"
}
Button {
anchors.horizontalCenter: parent.horizontalCenter
y: parent.height * 3 / 4
text: "Back"
onClicked: stackView.pop()
}
}
// AppToolBar.qml
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
ToolBar {
RowLayout {
width: parent.width
ToolButton {
enabled: stackView.depth > 1
icon.source: "chevron-left-32.svg"
opacity: enabled ? 1 : 0
onClicked: stackView.pop()
}
Label {
Layout.fillWidth: true
text: "Page Title"
horizontalAlignment: Qt.AlignHCenter
}
ToolButton {
icon.source: "handle-vertical-32.svg"
}
}
}
// chevron-left-32.svg: https://raw.githubusercontent.com/Esri/calcite-ui-icons/master/icons/chevron-left-32.svg
// handle-vertical-32.svg: https://raw.githubusercontent.com/Esri/calcite-ui-icons/master/icons/handle-vertical-32.svg
You can Try it Online!
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论