#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. Приведите минимальный воспроизводимый пример в этом случае