Почему нельзя изменить значение QSpinBox, если изменение сделано в методе paintEvent?
Поскольку вы создаете бесконечный цикл в асинхронной части приложения.
Когда любое значение графического интерфейса пользователя обновляется, чтобы пользователь мог его увидеть, оно должно быть перекрашено, и для этого разработчик вызывает update()
, этот метод внутренне отправляет событие QEvent::Paint
, и в случае событий это отправляется всем виджетам от родителя к потомку, в этом случае событие QEvent::Paint
сначала поступает в MainWindow, а затем, возможно, достигает спинбокса вашего потомка. Это только передано детям, если родитель использует это. Тогда последовательность выглядит следующим образом:
- Пользователь изменил значение
QSpinbox
- Это называется
update()
- Событие
QEvent::Paint
отправляется окну и перераспределяет его дочерним элементам.
- Он достигает главного окна, изменяет значение и переходит к шагу 2.
В заключение, если вы измените значение spinbox, он косвенно вызовет метод paintEvent в MainWindow и установит spinbox на предыдущее значение. Задача paintEvent (...) состоит только в том, чтобы рисовать , а не обновлять другое значение, в противном случае это, вероятно, создаст бесконечный цикл.