Changer le modèle ne redessine pas les objets en QML parfois

0

La question

            Repeater {
                model: myModel.buttonParameters
                delegate: Button
                {
                    width: 47
                    height:  47
                    contentItem: Text {
                        id: content
                        text: modelData.name
                        font.family: MyStyle.fontFamily
                        fontSizeMode: Text.Fit
                        font.pixelSize: 30
                        font.styleName: "Bold"
                        topPadding: height / 6
                        color: modelData.visibility ? MyStyle.colorFromSeriesName(this.text) : MyStyle.dividerColor
                        horizontalAlignment: Text.AlignHCenter
                        verticalAlignment: Text.AlignVCenter
                    }

                    background: Rectangle
                    {
                        anchors.fill: parent
                        radius: 4
                        color: MyStyle.backgroundColor
                        border.color:MyStyle.dividerColor
                        border.width: 2
                    }

                    onClicked: {
                        cntModel.visibilityOfChartChanged(modelData.name, "plot");
                    }
                }
            }
            
            On the C++ side.
            myModel.buttonParameters is a QList<MyModel*> , where MyModel is a class inherited from QObject.
            
           Q_PROPERTY(QVariant buttonParameters READ buttonParametersList NOTIFY buttonParametersChanged)

           QVariant buttonParametersList()
          {
             return QVariant::fromValue(m_buttonParametersList );
          }
           

Le problème est que, avec un certain changement dans le modèle (le signal buttonParametersChanged est envoyée), à savoir, si le nombre d'objets est égal à un et après la mise à jour il y est également un objet, mais avec des caractéristiques différentes, pas de redessiner prend place, la vieille bouton reste. En outre, il dépend en quelque sorte le moteur d'exécution. Aussi, si je supprime la ligne avec la couleur, le modèle de mise à jour.

c++ qml repeater
2021-11-16 13:19:09
1

La meilleure réponse

0

Le problème est que buttonParametersChanged est un signal qui déclenche sur l'attribution d'un nouveau conteneur (QList<>) pour buttonParameters. Il n'a pas de déclenchement sur la modification du contenu d'une QList<> affectée à cette propriété.

Cependant, vous pouvez déclencher manuellement buttonParametersChanged lorsque vous savez que vous avez modifié le contenu de la QList<> qui devrait vous donner l'effet que vous voulez.

Remarque, un QML ListModel ou C++ équivalent serait probablement plus approprié pour ce cas d'utilisation. De nombreux QML composants sont conçus pour intégrer précisément avec eux et de gérer les cas de conteneur des matières changer.

2021-11-16 14:26:45

C'est la chose, je l'appelle le signal buttonParametersChanged manuellement, et dans certaines situations, il ne fonctionne pas
Narina

Je voudrais ajouter un onButtonParametersChanged gestionnaire de journaux de quelque chose de sorte que vous pouvez vous assurer que le signal est vraiment de tir quand vous pensez qu'il est.
David K. Hess

Le signal est certainement tiré, j'ai vérifié.
Narina

Fournir une quantité minimale reproductible exemple dans ce cas
GrecKo

Dans d'autres langues

Cette page est dans d'autres langues

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................