, когда я пишу функцию paintEvent QWidget, нет никакой необходимости вручную писать коды, о которых часть виджета должна быть окрашена [?]
Это правильно. Художник, пройденный к вам, уже привязан к прямоугольнику вашего виджета, поэтому вы не можете рисовать за пределами своего виджета. Если ваша картина дешевая, вы можете перерисовать весь виджет сразу и проигнорировать прямоугольник или область перерисовки, переданные в событии рисования.
Вы также не должны слепо предполагать, что покраска только части виджета будет чем-то изначально быстрее. Вы должны это измерить!
Не могли бы вы объяснить больше о направлении распространения paintevent, обычно события qt распространяются как child-> parent, но является ли paintevent другим?
Все виджеты, которые должны быть окрашены, окрашены. Событие не распространяется, оно доставляется непосредственно соответствующим виджетам под руководством компоновщика виджета.
[...] Когда вызывается дочерний элемент widget's paintEvent, он также вызывает вызванный PaintEvent своего родительского виджета. Почему это?
Два отдельных виджета могут быть окрашены. Просто потому, что они являются родителями, а ребенок мало что значит. Каждый виджет заботится о своем событии рисования в изоляции. У компоновщика виджета (резервное хранилище) есть большая картина. Если родитель покрашен по какой-либо причине только до того, как ребенок будет нарисован, то, вероятно, ребенок не будет непрозрачным, а родитель будет окрашен так, чтобы ребенок мог быть составлен поверх него. Установите Qt::WA_OpaquePaintEvent
, если ваш paintEvent
делает непрозрачную картину, и никакая часть родителя не видна через то, что написано.