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

#c #qml #repeater

Вопрос:

 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 QListlt;MyModel*gt; , where MyModel is a class inherited from QObject.    Q_PROPERTY(QVariant buttonParameters READ buttonParametersList NOTIFY buttonParametersChanged)   QVariant buttonParametersList()  {  return QVariant::fromValue(m_buttonParametersList );  }    

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

Комментарии:

1. Интересно, если я изменю текст: modelData.name для MyModel.buttonParameters[индекс].имя, данные модели.видимость для MyModel.buttonParameters[индекс].видимость, все будет работать, кнопки будут перерисовываться с новым текстом и цветом. Оказывается , проблема в данных модели, но почему?

Ответ №1:

Проблема в том, что buttonParametersChanged-это сигнал, который срабатывает при назначении нового контейнера (QListlt;gt;) для параметров кнопок. Он не срабатывает при изменении содержимого существующего QListlt;gt;, назначенного этому свойству.

Однако вы всегда можете вручную вызвать изменение параметров кнопки, когда узнаете, что изменили содержимое QListlt;gt;, что должно дать вам желаемый эффект.

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

Комментарии:

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

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

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

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