Когда вы используете insertRow(0)
, вы вставляете в позицию 0, поэтому предыдущий элемент 0 теперь будет тем, который имеет соединение и получит сигнал.
Таким образом, последний вставленный элемент не будет иметьсоединение, когда нажата нажатая, поэтому он не будет уведомлен.
Для иллюстрации я объясню это шаг за шагом:
В первой вставке естьнет элементов, поэтому никто не получает сигнал.
Во второй вставке предыдущий элемент 0 будет текущим 1, и у него будет соединение, поэтому он будет уведомлен.
В третьей вставке предыдущий элемент 0 будет текущим 1, а предыдущий будет текущим 2, поэтому 1, 2 имеют соединение и будут уведомлены.
В заключение, создание делегата происходит после выдачи сигнала myPropertyChanged
, поэтому вставленный делегат не будет уведомлен, остальные будут, а поскольку ваша вставка всегда находится в первомЭто никогда не будет напечатано qml: 0, n
Для графического понимания предположим, что есть делегаты, и, поскольку они уже существуют, они получат уведомление:
0 0 (+)
0 (+) 1 (+) 1 (+)
1 (+) 2 (+) 2 (+)
2 (+) 3 (+) 3 (+)
... --> clicked --> myPropertyChanged --> ... --> 4 (+)
n (+) n+1 (+) n+1 (+)
(+): указывает, что естьis connection
Более подробное объяснение:
Для ясности правила цикла событий следующие: последовательные задачи выполняются с приоритетом, вызовысигналы поступают, если они не являются срочными.
Давайте проанализируем ваш код более подробно:
- insertRow (0);
- m_myProperty = m_animals.count ();
- emit myPropertyChanged ();
Предыдущие строки выполняются последовательно, поэтому в конце первого шага естьуже новый элемент в модели, но представление не было обновлено, так как для этого код должен вернуться в цикл обработки событий, и для этого он должен завершить выполнение шага 3.
Сразу после завершения шага 3,задачи по сигналу выполняются, поэтому вы создаете - создаете делегат и соединение, поэтому теперь вы отдаете приоритет сигналу myPropertyChanged
и вызываете существующие соединения минус последнее, так как оно не существовало, когда сигнал испускался.
В заключение будут вызываться только те слоты, которые существуют, когда сигнал испускает сигнал, новые соединения, которые создаются сразу после выдачи сигнала, пока вызов слота не будет вызван.