Dynamische erzeugen von Rechtecken mit QT

Gast #6530980
Lesenswert?

Hallo zusammen,
auf meiner QML page habe ich eine ScrollView
1
ScrollView {
2
        width: 200
3
        height: 200
4
        clip: true
5

6
        Label {
7
            text: "ABC"
8
            font.pixelSize: 224
9
        }
10
    }

Darin möchte ich verschobene Rechtecke dynamisch erzuege. Heir ein 
Pseudo code
1
for (int i = 0; i < 3; i++){
2
create rectangle(x=i,y=i,width=2,height=2)
3
}

Gibt es da eine einfache Lösung?

Danke
#6531078
Lesenswert?

Was genau meinst du mit dynamisch? Willst du einfach mehrere per 
Schleife definieren? Dann kannst du einen Repeater verwenden.
1
Repeater
2
{
3
    model: 3
4
    delegate: Rectangle { x: index; y: index; width: 2; height: 2 }
5
}

als model kannst du statt eines einfachen integer auch z.B. eine Liste 
verwenden, um für jedes Element einzeln Properties festlegen zu können.
#6531123
Lesenswert?

Und genau dafür ist das Model da. Wenn sich das ändert, aktualisiert das 
auch die Objekte im QML.
Zitat von meinem Link:
"QML views are automatically updated when the model changes. Remember 
the model must follow the standard rules for model changes and notify 
the view when the model has changed by using 
QAbstractItemModel::dataChanged(), 
QAbstractItemModel::beginInsertRows(), and so on. See the Model 
subclassing reference for more information."

Also leitest du in C++ von QAbstractItemModel ab, verwaltest dort deine 
Einträge mit allen Daten, die sie brauchen, und im QML nutzt du dieses 
Model für die Darstellung.
#6544991
Lesenswert?

Zum Beispiel ein ColumLayout, und jede Zeile ist da drin dann ein 
RowLayout. Alternativ kann man die Elemente per anchors an einander 
ausrichten. Vielleicht kennst du aber auch sowieso die Position und 
Größe deiner Elemente, so dass du da eigentlich gar nichts layouten 
musst? Dann kannst du sie auch einfach direkt positionieren, ohne sie in 
irgendwas einzusortieren.
Ungefähr sowas:
1
Window
2
{
3
    width: 500
4
    height: 100
5

6
    Repeater
7
    {
8
        model: ListModel
9
        {
10
            ListElement { column: 0; start:  0;  end: 100; name: "Hallo" }
11
            ListElement { column: 0; start: 140; end: 260; name: "Welt"  }
12
            ListElement { column: 1; start:  40; end: 230; name: "Qt"    }
13
            ListElement { column: 1; start: 240; end: 300; name: "User"  }
14
        }
15

16
        delegate: Rectangle
17
        {
18
            color: "green"
19
            x: 10 + start
20
            y: 10 + column * 30
21
            width: end - start
22
            height: 20
23
            radius: 5
24

25
            Text
26
            {
27
                anchors.fill: parent
28
                text: model.name
29
                color: "white"
30
                horizontalAlignment: Text.AlignHCenter
31
                verticalAlignment: Text.AlignVCenter
32
            }
33
        }
34

35
    }
36
}

Du musst das dann eben mit den Daten aus deinem Model statt dem obigen 
ListModel füttern.
#6545194
Lesenswert?

Qt User schrieb:
> Aber mir ist nicht ganz klar wie man Zeilen hinzufügen kann.

Ich weiß nicht, was ich dir dazu noch sagen soll, weil ich es schon 
dreimal gesagt habe: Das kommt durch das Modell.
In meinem Beispiel habe ich ein ListModel verwendet, aber da kannst du 
stattdessen auch ein eigenes Model in C++ machen.
Der QML-Code fragt, wenn es was neu zeichnen muss, dein Modell, wie 
viele Elemente es gibt und zeichnet eben so viele, wie dein Modell sagt. 
Dynamisch ändern tust du das, indem dein Modell eben seinen Inhalt 
dynamisch ändert.
Der Link erklärt alle Arten, wie man so ein Modell in C++ schreiben kann 
und auch, wie man das so gestaltet, dass es sich sowohl von der 
C++-Seite aus, als auch von der QML-Seite aus dynamisch ändern kann.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren