Как рисовать с помощью QPainter только после определенного события? - PullRequest
1 голос
/ 15 августа 2011

У меня есть главное окно с несколькими виджетами, каждый из которых нуждается в собственной графике.Я хотел бы использовать QPainter для рисования на них фигур, линий и т. Д., Но только после определенного события, например нажатия кнопки.

Проблема в том, что если я просто создаю QPainter в любой функции, он не будет работать:

QPainter::setPen: Painter not active

Методы QPainter могут вызываться только внутри paintEvent(QPaintEvent *) функции!Это вызывает следующие проблемы:

  1. Я должен получить свои собственные классы для всех виджетов, на которых я хотел бы рисовать, поэтому я не могу использовать конструктор для размещения своих виджетов.Это может расстроить большое количество виджетов.

  2. Виджеты перерисовывают себя после каждого события рисования окна, например, перемещения его или перемещения других окон перед ним.Я много рисую в этих виджетах, поэтому в этих случаях они будут заметно мигать.

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

1 Ответ

1 голос
/ 15 августа 2011

Вы можете использовать пользовательские виджеты в конструкторе: Создание пользовательских виджетов для Qt Designer .

Архитектура на основе плагинов в Qt Designer позволяет редактировать пользовательские и сторонние пользовательские виджеты так же, как вы делаете со стандартными виджетами Qt.

Для вашего второго вопроса, один из подходов заключается в создании QPixmap для каждого из ваших виджетов. Когда внешний вид вашего виджета необходимо изменить, вы рисуете в этом растровом изображении (используя конструктор QPainter, который принимает QPaintDevice - QPixmap - QPaintDevice).

В функции paintEvent вашего виджета вы просто заполняете свой виджет этим «кэшированным» растровым изображением. Таким образом, вы делаете (потенциально дорогой) рисование только тогда, когда это действительно необходимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...