2015-08-05 2 views
1

Документация Qt гласит:Что рисовать в реализации paintEvent?

Многие виджеты могут просто перекрашивать всю поверхность, когда ее просят, но некоторые медленные виджеты необходимо оптимизировать, покрасив только запрошенный регион: QPaintEvent :: region(). Эта оптимизация скорости не изменяет результат, так как покраска подрезается к этому региону во время обработки события. Например, QListView и QTableView делают это.

Это означает, что когда я пишу функцию paintEvent QWidget, нет необходимости вручную писать коды о том, какая часть виджета должна быть нарисована, и все это обрабатывается автоматически самим qt?

ответ

1

, когда я пишу функцию paintEvent QWidget, нет никакой необходимости вручную писать коды, о которых часть виджета должна быть окрашена [?]

Это правильно. Художник, пройденный к вам, уже привязан к прямоугольнику вашего виджета, поэтому вы не можете рисовать за пределами своего виджета. Если ваша картина дешевая, вы можете перерисовать весь виджет сразу и проигнорировать прямоугольник или область перерисовки, переданные в событии рисования.

Вы также не должны слепо предполагать, что покраска только части виджета будет чем-то изначально быстрее. Вы должны это измерить!

Не могли бы вы объяснить больше о направлении распространения paintevent, обычно события qt распространяются как child-> parent, но является ли paintevent другим?

Все виджеты, которые должны быть окрашены, окрашены. Событие не распространяется, оно доставляется непосредственно соответствующим виджетам под руководством компоновщика виджета.

[...] Когда вызывается дочерний элемент widget's paintEvent, он также вызывает вызванный PaintEvent своего родительского виджета. Почему это?

Два отдельных виджета могут быть окрашены. Просто потому, что они являются родителями, а ребенок мало что значит. Каждый виджет заботится о своем событии рисования в изоляции. У компоновщика виджета (резервное хранилище) есть большая картина. Если родитель покрашен по какой-либо причине только до того, как ребенок будет нарисован, то, вероятно, ребенок не будет непрозрачным, а родитель будет окрашен так, чтобы ребенок мог быть составлен поверх него. Установите Qt::WA_OpaquePaintEvent, если ваш paintEvent делает непрозрачную картину, и никакая часть родителя не видна через то, что написано.

Смежные вопросы