StackPanel, эквивалентный в Qt Quick 2 / QML - проблема с шириной - PullRequest
0 голосов
/ 09 мая 2019

Я пытаюсь сделать эквивалент стековой панели wpf, у меня уже была логика и я реализовал ее, но что-то не так с шириной, я не знаю, как создавать новые компоненты без привязки к петле ширины, вот мой StackPanel:

StackPanel.qml

import QtQuick 2.12
import QtQuick.Controls 2.12
import KiMa.Models 1.0
Item {
    id:root
    property var orientation : UOrientation.Horizontal
    property int itemSpacing : 10
    default property list<Item> pageData
    Loader{
        property var childs
        anchors.fill: parent
        id:loader
        onChildsChanged: {
            if(root.pageData != null){
                for(var z = 0;z<root.pageData.length;++z){
                    root.pageData[z].parent = loader.childs
                }
            }
        }

    }
    state: orientation == UOrientation.Horizontal ? "row": "col"
    states: [
        State {
            name: "row"
            PropertyChanges {
                target: loader
                sourceComponent : row
            }
        },
        State{
            name: "col"
            PropertyChanges {
                target: loader
                sourceComponent : col
            }
        }

    ]
    Component{
        id:col
        Column{
            Component.onCompleted: {
                childs = _col;
            }
            id:_col
            width: parent.width
            spacing: root.itemSpacing
        }
    }
    Component{
        id:row
        Row{
            Component.onCompleted: {
                childs = _row
            }
            id:_row
            width: parent.width
            layoutDirection: Qt.RightToLeft
            spacing: root.itemSpacing
        }
    }
}

и мое перечисление ориентации выглядит так:

#ifndef UORIENTATION_H
#define UORIENTATION_H
#include<QObject>

class UOrientation
{
    Q_GADGET
public:
    explicit UOrientation();
    enum Orientation{
        Horizontal,
        Vertical
    };
    Q_ENUM(Orientation)
};

#endif // UORIENTATION_H

и пример использования должен быть таким:

StackPanel{
    x: 320
    height: 50
    anchors.horizontalCenter: parent.horizontalCenter
    anchors.bottom: parent.bottom
    anchors.bottomMargin: 25
    Button{

    }
    Button{

    }
}

вам нужно добавить это в main.cpp :

qmlRegisterUncreatableType<UOrientation>("KiMa.Models",1,0,"UOrientation","its not creatable type!");

Этот код работает, если у вас есть что предложить, чтобы я изменился, или вы думаете, что я допустил ошибку, дайте мне знать, единственная проблема, которую я вижу здесь, это привязка ширины.

Я уже пытался использовать childrenRect, но он не работает :

width: childrenRect.width
height: childrenRect.height

Примечание : стекпанель, позволяющая вам укладывать элемент за элементом друг на друга, вы можете установить ориентацию по горизонтали или вертикали, чтобы в qt были столбец и строка вместе, что я уже сделал.
вертикальный: a vertical stack panel
горизонтальный:
a horizontal stack panel

1 Ответ

4 голосов
/ 09 мая 2019

Вы можете легко сделать это с помощью Grid, установив число columns.Если вам нужен отдельный компонент, вы можете создать свой StackPanel.qml со следующим:

import QtQuick 2.0

Grid {
    property int orientation: Qt.Horizontal
    columns: orientation === Qt.Horizontal ? -1 : 1
}

QML StackPanel

Если вы хотите прокручиваемый объект, выможно также использовать ListView с моделью ObjectModel.ListView имеет свойство orientation.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...