• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Repeater dla wszystkich właściwości obiektu

Cloud VPS
0 głosów
281 wizyt
pytanie zadane 1 marca 2019 w C i C++ przez MikDal Mądrala (5,660 p.)
edycja 1 marca 2019 przez MikDal

Cześć,

otóż zastanawiam się nad możliwością takiej konfiguracji obiektu Repeater w QML, który stworzy mi układ dla WSZYSTKICH właściwości modelu bez wykorzystania JavaScript.

I tak model aktualnie to:

#include <QObject>
#include <QString>
class ViewModel : public QObject
{
	Q_OBJECT
	Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged)
	Q_PROPERTY(uint material READ material WRITE setMaterial NOTIFY materialChanged)
	Q_PROPERTY(uint distance READ distance WRITE setDistance NOTIFY distanceChanged)
	Q_PROPERTY(uint tolerance READ tolerance WRITE setTolerance NOTIFY toleranceChanged)
}

natomiast w widoku chciałbym uzyskać coś takieg:

Repeater {
				
    // To poniżej oczywiscie nie działa...
    model: model.properties
	Label {
		text:  property.name
	}
	SpinBox {
		value:  property.value
	}
}

Czy borykał się ktoś juz z podobnym problemem? Ważną rzeczą jest to, aby wartości mogły być wiązane, czyli aby calość pozwalała na modyfikację wartości modelu z widoku.

komentarz 1 marca 2019 przez Secrus Nałogowiec (32,880 p.)
C++ bez wykorzystania JavaScript? Piszesz jakąś stronę w C++? Czy o co chodzi?
komentarz 1 marca 2019 przez MikDal Mądrala (5,660 p.)

@MikDal, nie zaznaczyłem tego wyraźnie w tekście, ale chodzi o QML, technologię Qt :).

2 odpowiedzi

0 głosów
odpowiedź 1 marca 2019 przez Bondrusiek Maniak (61,440 p.)

Troszkę nie rozumiem pytania. model dla obiektu Repeater może być za dokumentacją

  • A number that indicates the number of delegates to be created by the repeater
  • A model (e.g. a ListModel item, or a QAbstractItemModel subclass)
  • A string list
  • An object list

Możesz sobie w QML stworzyć obiekt i w nim edytować dane np

    QtObject {
        id: property
        property string name
        property int value
        property variant properties
    }

a następnie wykonywać je w Repeater. Jeszcze lepszą opcją jest wykonania własnego modelu w QML.

Ewentualnie możesz stworzyć model w C++ a następnie wysłać go do QML i tam go wyświetlać np

...
#include "mymodel.h"


int main(int argc, char *argv[])
{
...
    MyModel myModel;

    QQmlApplicationEngine engine;
    engine.rootContext()->setContextProperty("myModel", &myModel);
...
}

 

komentarz 1 marca 2019 przez MikDal Mądrala (5,660 p.)
Obiekt i kontekst mam ustawiony, chodzi o to, aby stworzyć Repeater, który pozwoli na interowanie po właściwościach obiektu, czyli w przypadku, który podałeś, to po: name, value, properties, a nie po samych obiektach zawierających te właściwości. Bo problem polega na tym, że mam obiekt który ma kilka właściwości tego samego typu i nie chciałbym robić w kodzie na okrągło tego samego (pol edycyjnych dla każdej z nich) tylko zrobić to raz za pomocą Repeatera.
0 głosów
odpowiedź 10 marca 2019 przez MikDal Mądrala (5,660 p.)

Znalazłem odpowiedź w stopniu mnie zadowalającym. Ze względu na specyfikę QML oraz po dalszych przemyśleniach uznają, że taka odpowiedź jest najlepsza:

Item {
    property var model
    
    property var propertyToShowAndEdit: [
            {
                name: "Wlaściwośc pierwsza",
                setValue: function(value) { model.property1 = value; },
                getValue: function() { return model.property1; },
            }, 
            {
                name: "Wlaściwośc druga",
                setValue: function(value) { model.property2 = value; },
                getValue: function() { return model.property2; },
            },							
            // I następępne
        ]


    Repeater {
        model:  parent.propertyToShowAndEdit.length

        Label {
            Layout.column: 0
            Layout.row: index

            text: parent.propertyToShowAndEdit[index].name + ":"
            Layout.alignment: Qt.AlignRight
            font.pointSize: 13.8
        }
    }
    Repeater {
        model:  parent.propertyToShowAndEdit.length
        
        SpinBox {
            Layout.column: 1
            Layout.row: index

            onValueModified: parent.propertyToShowAndEdit[index].setValue(this.value)
            Component.onCompleted: this.value = parent.propertyToShowAndEdit[index].getValue()
        }
    }
}

 

 

Podobne pytania

–1 głos
1 odpowiedź 153 wizyt
pytanie zadane 2 maja 2016 w JavaScript przez czaro05 Nowicjusz (120 p.)
0 głosów
0 odpowiedzi 198 wizyt
pytanie zadane 28 grudnia 2022 w C i C++ przez M1983 Nowicjusz (120 p.)
+1 głos
3 odpowiedzi 825 wizyt
pytanie zadane 20 lutego 2020 w C i C++ przez niezalogowany

93,487 zapytań

142,420 odpowiedzi

322,772 komentarzy

62,903 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...