Изменение модели иногда не перерисовывает объекты в QML

0

Вопрос

            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 );
          }
           

Проблема в том, что при определенном изменении модели (отправляется сигнал buttonParametersChanged), а именно, если количество объектов было равно единице и после обновления также остается один объект, но с другими характеристиками, перерисовка не происходит, старая кнопка остается. Более того, это как-то зависит от времени выполнения. Кроме того, если я удалю линию с цветом, модель обновится.

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

Лучший ответ

0

Проблема в том, что buttonParametersChanged-это сигнал, который срабатывает при назначении нового контейнера (QList<>) для buttonParameters. Это не приводит к изменениям в содержимом существующего списка QList<>, назначенного этому свойству.

Тем не менее, вы всегда можете вручную инициировать изменение параметров кнопок, когда вы знаете, что изменили содержимое списка QList<>, что должно дать желаемый эффект.

Обратите внимание, что эквивалент модели списка QML или C++, вероятно, будет более подходящим для этого случая использования. Многие компоненты QML разработаны специально для интеграции с ними и обработки случаев изменения содержимого контейнеров.

2021-11-16 14:26:45

В том-то и дело, что я называю сигнальные кнопкипараметры измененными вручную, и в некоторых ситуациях это не работает
Narina

Я бы добавил обработчик onButtonParametersChanged, который что-то регистрирует, чтобы вы могли убедиться, что сигнал действительно срабатывает, когда вы думаете, что это так.
David K. Hess

Сигнал определенно сработал, я проверил.
Narina

Приведите минимальный воспроизводимый пример в этом случае
GrecKo

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................