Forum: PC-Programmierung Dynamische erzeugen von Rechtecken mit QT


von QTuser (Gast)


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

von Rolf M. (rmagnus)


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.

: Bearbeitet durch User
von Qt User (Gast)


Lesenswert?

Ich möchte ein Rechteck definieren in meinem c Code sodass es dann in 
meiner Oberfläche angezeigt wird.

Am Ende will ich dynamich ein EPG darstellen so wie z.b. hier 
https://community.yatse.tv/t/pvr-epg-guide-overview-like-the-guide-view-in-kodi/92

von Qt User (Gast)


Lesenswert?

Also einfach gesagt ein Objekt erzeugen und es platzieren können über 
den c code

von Rolf M. (rmagnus)


Lesenswert?

Ich würde die Elemente eher direkt im QML erzeugen und Platzieren und 
auf der C++-Seite nur die Daten zur Verfügung stellen.
Man kann z.B. das Model auch von C++ aus befüllen oder ein eigenes 
schreiben. Siehe 
https://doc.qt.io/qt-5/qtquick-modelviewsdata-cppmodels.html

von Qt User (Gast)


Lesenswert?

Aber ich kann es ja nicht erzeugen, da sich die Sendungen (also die 
Anzahl und die Länge der Rechtecke) von Tag zu Tag ändert. Daher das 
dynamische.

von Rolf M. (rmagnus)


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.

von Qt User (Gast)


Angehängte Dateien:

Lesenswert?

Und wie kann ich so eine Ansicht dynamisch erzeugen??? Mit listview geht 
es ja nur horizontal oder vertikal und mit GridView ist die einzelne 
Zelle ja immer gleich.

von Rolf M. (rmagnus)


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.

: Bearbeitet durch User
von Qt User (Gast)


Lesenswert?

Und wie kann ich dieses dynamisch erzeugen?

Und beliebig erweitern?

von Rolf M. (rmagnus)


Lesenswert?

Immer noch, indem du das Model aus deinem C++-Code bereit stellst. Den 
Link dazu, wie man das macht, habe ich oben schon mal gepostet.

Rolf M. schrieb:
> https://doc.qt.io/qt-5/qtquick-modelviewsdata-cppmodels.html

von Qt User (Gast)


Lesenswert?

Ich weiss weder wieviele Zeilen, noch wieviele einzelne Rechtecke. 
Beides soll dynamisch erzeugt werden.

von Qt User (Gast)


Lesenswert?

Das ist mir klar mit dem Model und dem Rechteck....die Rechtecke kann 
ich bereits erzeugen.



Aber mir ist nicht ganz klar wie man Zeilen hinzufügen kann.

von Rolf M. (rmagnus)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.