Как найти источник рекурсивной перестановки в QML

Я обновил свое приложение QML с Qt 5.12 до Qt 5.15.

Мое приложение загружает свои источники qml, используя следующий код:

auto* engine = new QQmlApplicationEngine(this);
...
engine->load(QUrl("qrc:/main.qml"));

Когда вызывается engine->load, теперь я получаю следующее предупреждение, которого не было в Qt 5.12:

Qt Quick Layouts: обнаружена рекурсивная перестановка. Прерывание после двух итераций.

Как я могу найти источник этого предупреждения, чтобы исправить свой код?

Редактировать:

После двух отрицательных голосов я хотел бы уточнить цель моего вопроса.

У меня есть очень большое приложение, которое загружает большое дерево файлов qml, при этом main.qml является основным окном. Предупреждение, которое я опубликовал, исходит из панели вывода приложения без каких-либо указаний на расположение исходного файла, вызвавшего предупреждение.

Я ищу способ найти местоположение исходного файла, вызвавшее такое предупреждение. Я считаю разумным спросить, как этого добиться, и я считаю, что это общая проблема, которая возникнет у многих людей, которые обновят свой код qml до Qt 5.15. Характер такой проблемы заключается в том, что автономный пример (например, запрошенный в комментариях) не может быть предоставлен.


person FourtyTwo    schedule 16.07.2020    source источник
comment
пожалуйста, предоставьте минимальный воспроизводимый пример, иначе кажется невозможным решить проблему, не видя кода.   -  person folibis    schedule 16.07.2020
comment
Я думаю, вам придется пройти долгий путь, комментируя части QML и пытаясь рекурсивно. Вероятно, вы можете ограничиться RowLayout, ColumnLayout и GridLayout.   -  person Amfasis    schedule 16.07.2020
comment
@folibis Вы были бы правы, если бы это предупреждение было связано с расположением файла ресурсов. Это не. Это просто однострочная запись в выводе приложения, без каких-либо подсказок, где находится исходный код, вызывающий это. Из-за этого очень сложно отследить источник ошибки, и я ищу способ отследить ошибку. Я отредактирую сообщение, чтобы сделать это более понятным.   -  person FourtyTwo    schedule 16.07.2020
comment
Разумно запросить больше кода, чтобы сообщество могло помочь найти виновника. Если ваш проект слишком велик для публикации, вы можете рассчитывать на помощь только на очень низком уровне. Кроме того, я бы не ожидал, что кто-то будет копаться в большом проекте, где я могу сделать это сам, как я описал в своем другом комментарии. Кроме того, я не смог найти никаких ссылок на предоставленное сообщение журнала в кодовой базе Qt. Возможно, вы используете какой-либо другой импорт?   -  person Amfasis    schedule 16.07.2020
comment
@Amfasis Я в основном согласен с тобой. И, конечно же, я не хочу, чтобы кто-то копался в моем большом проекте. Я подумал, что должен быть более простой путь, чем длинный путь, который вы упомянули выше, и я подумал, что если есть более простой путь, он может быть интересен большему количеству людей, чем только мне, - поэтому я разместил это здесь. Предупреждение исходит из этой строки в кодовой базе Qt: code.qt.io/cgit/qt/qtdeclarative.git/tree/src/imports/layouts/ и похоже, что он не будет частью Qt 5.15 .1 - наверное поэтому и не нашли...   -  person FourtyTwo    schedule 16.07.2020
comment
@FourtyTwo согласился с публикацией в интересах других! Вы нашли еще один намек на поиск виновника: это должен быть GridLayout. Мне также интересно, можно ли добавить больше журналов в ту функцию, которую вы нашли, например, указатель объекта или, в конечном счете, местоположение qml (я где-то читал это, но не могу найти). Другой вариант — добавить console.log к каждому GridLayout, который у вас есть (используйте некоторые навыки поиска и замены).   -  person Amfasis    schedule 16.07.2020


Ответы (1)


Это вполне разумный вопрос - предупреждение неоднозначно, поэтому вам придется опубликовать всю кодовую базу, чтобы получить минимально жизнеспособный результат. Afaik, нет разумного способа найти проблемные биты программно, но ищите компоненты макета (RowLayout, ColumnLayout, GridLayout), вложенные в компонент макета того же типа; это обычные преступники. Например:

ColumnLayout {

    ColumnLayout {
        id: childColumnLayout

        // this is generally the cause of your grief
        // changing the the child ColumnLayout to a Column usually fixes it for me

    }
}
person lesley    schedule 05.11.2020