Политика конфиденциальностиКонтактыО сайтеОтзывыGitHubDonate
© EVILEG 2015-2018
Рекомендует хостинг
TIMEWEB
e
8 ноября 2016 г. 9:08

QML Binding loop detected for property

signal, qml, connections

Добрый день! Во вложении пример (Qt 5.7.0) , в котором при нажатии на кнопку подгружается Pane в StackView. Проблема в том, что в отладочном окне выводится сообщение: Binding loop detected for property “contentHeight”. Это сообщение появляется при добавлении второго Label в Pane со свойством Text.WordWrap. При добавлении еще Label – сообщения растут как на дрожжах. Как это вылечить?
7

Добрый день.
Петля из-за того, что VerifyWarningPage объявлено в качестве property, эта штука находится вне StackView, а когда помещаете его в StackView, то начинает сходить с ума.

сделайте вот так

    Button {
        text: "test"
        onClicked: stackView.push("qrc:/VerifyWarningPage.qml")
    }

 

0
e
Хорошо, но как же тогда соединить сигналы VerifyWariningPage со слотами в main, если VerifyWariningPage вне области видимости?
0

1. Переименовать сигнал в VerifyWarningPage . Вы назвали его как обработчик.
То есть, допустим сигнал называется anySignal(), а обработчик уже будет называться как onAnySignal(). В вашем же случае придётся тогда обработчик определять как onOnWarning:
Следовательно называем следующим образом:

signal warning(string source, string title)

Подробнее про сигналы и слоты в QML можно прочесть здесь Сигналы и слоты в QML

2. Прикрутить Connections на текущий item в stackView:

Connections {
    target: stackView.currentItem
    onWarning: console.log("Hello")
}

Конечно, может быть такая ситуация, что разные сигналы используются для разных item`ов в stackView. Но я не заметил утечек памяти, даже если и ругается ошибками приложение, тем не менее сигналы и слоты нормально подключаются и всё работает. А вообще в таком случае я стараюсь перепроектировать логику работы приложения, чтобы было как можно меньше таких некрасивых мест, но это уже вопрос местечковый.

0
e
Сообщения можно отключить ignoreUnknownSignals: true. Проблема в другом, разные item’ы в StackView имеют одинаковый сигнал currentIndexChanged, а обработчики должны быть разные, в предложенном варианте Connections это сделать не позволяет.
0

Я Вам ответил на поставленный вопрос. А некий сигнал currentIndexChanged, который Вы придумали в своём последнем сообщении вообще нигде до этого не фигурировал. То есть я про него не знал.

Поэтому исходя из этого:

Проблема в другом, разные item’ы в StackView имеют одинаковый сигнал currentIndexChanged,

Определитесь сначала, что именно пытаетесь сделать, и после этого только сформулируйте проблему. И желательно подробно её формулируйте, поскольку я не могу допридумывать за Вас, как будет работать Ваше приложение и какие могут быть у него проблемы.

А вообще, включайте воображение при решении задачи. Сигнал может передавать уникальный идентификатор конкретного Item, по которому через switch case конструкцию будет определяться логика обработки для конкретного item в stackview.

0
e
Евгений, большое Вам спасибо. Ваши ответы натолкнули меня на другой способ решения возникших проблем. Сигналы соединил скриптом, типа: 
var verifyTuPage = stackView.push(“qrc:/VerifyTuPage.qml”)
verifyTuPage.currentIndexChanged.connect(verifyTuPage_onCurrentIndexChanged)
 и так далее.
0
Хорошо, что всё получилось. Вы молодец.
И решение интересное подобрали в итоге.
0

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
v
17 января 2019 г. 11:51
vitalir12

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:20баллов,
  • Очки рейтинга-10
v
17 января 2019 г. 11:49
vitalir12

C++ - Тест 002. Константы

  • Результат:50баллов,
  • Очки рейтинга-4
v
17 января 2019 г. 11:13
vitalir12

C++ - Тест 003. Условия и циклы

  • Результат:28баллов,
  • Очки рейтинга-10
Последние комментарии
I
16 января 2019 г. 8:06
IscanderChe

Заработало. Забыл model->select(); вписать.
I
16 января 2019 г. 8:02
IscanderChe

Всё равно пусто, хотя строка с данными в базу добавляется.
16 января 2019 г. 7:51
Евгений Легоцкой

потому, что нужно сохранять информацию для всех остальных ролей и столбцов через вызов переопределённого метода. Да к тому же вы ещё и зациклили вызов метода data. QVariant MySqlTableModel:...
I
16 января 2019 г. 7:43
IscanderChe

Сделал вот так. В tableView ничего нет, кроме заголовка. QVariant MySqlTableModel::data(const QModelIndex &index, int role) const{ if (role == Qt::DisplayRole) { QTime ...
Сейчас обсуждают на форуме
18 января 2019 г. 11:26
nayk1982

Для Desktop делал так: void pause(int ms){ QTimer timer; timer.setInterval( qBound(1, ms, 3600000) ); timer.setSingleShot(true); QEventLoop loop; QObject::connect(&...
17 января 2019 г. 12:01
Алексей Внуков

у меня просто есть отдельное поле с чекбоксамими какие колонки нужно отображать CheckBox { id: checkBox text: qsTr("some text") checked: true onC...
15 января 2019 г. 16:53
Михаиллл

Спасибо, заработало.Но выдало обычный текст без форатирования HTML.Придется искать дальше
15 января 2019 г. 12:52
BlinCT

Я же вам выше написал CLion умеет работать с ремоут машинами. И Qt так же собирает.
Присоединяйтесь к нам в социальных сетях

Для зарегистрированных пользователей на сайте присутствует минимальное количество рекламы