Рисовать на пользовательском виджете после его рисования

У меня есть собственный виджет, который наследует QWidget. У него есть собственный paintEvent, и я не могу его изменить. Поэтому я хочу использовать такой виджет в своем диалоговом объекте, но мне нужно нарисовать на нем некоторую графику после того, как он отрисовывает свою собственную графику (этот виджет рисует на нем видеокадры, и мне нужно нарисовать несколько линий над ним). Могу ли я рисовать каждый раз после paintEvent этого виджета? Я использовал installEventFilter и перехватил событие с типом Qt::Paint, но я не вижу ничего, что утопил. Есть ли другой путь?

2 ответа

Решение
  1. Вы можете получить из пользовательского класса виджетов, переопределение paintEventи позвонить по наследству paintEvent Сначала сделай свой рисунок.

  2. Вы можете установить фильтр событий на виджет и сделать то же самое: вызвать виджет paintEvent Сначала сделай свой рисунок.

  3. Скрыть другой виджет. Создайте свой собственный виджет и вызовите другой виджет 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"
Другие вопросы по тегам