Рисовать на пользовательском виджете после его рисования
У меня есть собственный виджет, который наследует QWidget. У него есть собственный paintEvent, и я не могу его изменить. Поэтому я хочу использовать такой виджет в своем диалоговом объекте, но мне нужно нарисовать на нем некоторую графику после того, как он отрисовывает свою собственную графику (этот виджет рисует на нем видеокадры, и мне нужно нарисовать несколько линий над ним). Могу ли я рисовать каждый раз после paintEvent этого виджета? Я использовал installEventFilter и перехватил событие с типом Qt::Paint, но я не вижу ничего, что утопил. Есть ли другой путь?
2 ответа
Вы можете получить из пользовательского класса виджетов, переопределение
paintEvent
и позвонить по наследствуpaintEvent
Сначала сделай свой рисунок.Вы можете установить фильтр событий на виджет и сделать то же самое: вызвать виджет
paintEvent
Сначала сделай свой рисунок.Скрыть другой виджет. Создайте свой собственный виджет и вызовите другой виджет
render
метод в вашем виджетеpaintEvent
Затем сделайте свой рисунок. Поскольку другой виджет предположительно отображает видеокадры, которые периодически меняются со временем, вам может понадобиться таймер, чтобыupdate()
твой виджет
Ни в том, ни в другом случае вы не изменяете сторонний пользовательский виджет.
Для того, чтобы вызвать другой виджет защищен paintEvent
вам нужно использовать QWidget
даже если это просто дурачок, невидимка.
Это очень простой пример кода, который рисует внутри пользовательского виджета. Он рисует синий прямоугольник внутри QPushButton.
Используемый метод - именно то, что было описано в варианте 1 @Kuba
Таким образом, вы наследуете от пользовательского класса виджета, где вы хотите рисовать, переопределение paintEvent
и позвонить по наследству paintEvent
Сначала сделайте свой рисунок.
Надеюсь это поможет
#include <QApplication>
#include <QPushButton>
#include <QPainter>
#include <QPaintEvent>
// inherit from the class over which you want to draw
class DrawOverButton : public QPushButton
{
Q_OBJECT
public:
DrawOverButton(const QString &text, QWidget *parent = 0) :
QPushButton(text, parent)
{
// enlarge the button so there is some space to draw in
setStyleSheet("QPushButton {min-height: 60px; "
"min-width: 120px; margin: 5px;}");
}
protected:
virtual void paintEvent(QPaintEvent *event) {
// call the base class paint event method
// this will draw the base class content
QPushButton::paintEvent(event);
// draw a blue border inside the button
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing, true);
painter.setPen(QPen(QColor("#3cf"), 4));
const int distance = 20;
painter.drawRoundedRect(QRect(distance, distance,
width() - 2 * distance, height() - 2 * distance),
10, 10);
}
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
DrawOverButton *button = new DrawOverButton("Button");
button->show();
return a.exec();
}
#include "main.moc"