Как QT рисует элементы управления (такие как QLabel, Button, QWidget и т. д.)

метод первый:

Использовать механизм фильтрации событий

Фильтр событий:

Операция, состоящая из двух функций, используемых для завершения мониторинга событий компонента для других компонентов, две функции: installEventFilter();

фильтр событий(QObject *obj, QEvent *ev)

Все они являются функциями класса QObject.

как использовать:

Один, ui->paint_widget (имя субэлемента управления)->installEventFilter(this);//Установить фильтр событий   

Во-вторых, добавьте .h

bool eventFilter(QObject *наблюдаемый, QEvent *event);

Три, реализовать в .cpp

bool Form2::eventFilter(QObject *watched, QEvent *event)
{
    if(watched == ui->widget && event->type() == QEvent::Paint)//发生绘图事件,且是在widget上发生的
        {

        QPainter painter(ui->widget);

        // 设置画笔样式
        QPen pen(Qt::red);
        pen.setWidth(3);
        painter.setPen(pen);

        // 绘制圆形
        QRectF rectangle(10.0, 20.0, 80.0, 80.0);    // 圆形所在矩形位置和大小
        painter.drawEllipse(rectangle);

        return true;
        }
    else
        return false;

}

В-четвертых, обратите внимание на предпосылку использования: потому что, когда мы судим

event->type() == QEvent::Paint оценивает событие рисования

Поэтому вам нужно вызвать событие рисования, чтобы оно вступило в силу.

void Form2::paintEvent(QPaintEvent *)
{
    // 创建QPainter对象并在其中进行绘图
        QPainter painter(ui->widget);

        // 设置画笔样式
        QPen pen(Qt::red);
        pen.setWidth(3);
        painter.setPen(pen);

        // 绘制圆形
        QRectF rectangle(10.0, 20.0, 80.0, 80.0);    // 圆形所在矩形位置和大小
        painter.drawEllipse(rectangle);
}

Резюме: Из приведенного выше видно, что код реализации в событии отрисовки такой же, как код реализации в фильтре событий, поэтому его можно инкапсулировать в функцию. Таким образом, метод можно резюмировать следующим образом:

bool 类名::eventFilter(QObject *watched, QEvent *event)
{
    if(watched == ui->paint_widget && event->type() == QEvent::Paint)
    {
        Fun(想要绘图的指针名); //响应函数
    }
    return QWidget::eventFilter(watched,event);
}

//实现响应函数
void 类名::Fun(想要绘图的控件或窗口的类名 * 指针名)
{
   xxxxxxxxxxxxxxxxxx;
}


void 类名::paintEvent(QPaintEvent *)
{
    Fun(想要绘图的指针名);
}

Пример: Чтобы нарисовать виджет (красная часть рамки) в окне формы

 

Эффект:

 

 

 

Способ второй:

Определите класс самостоятельно, пусть он наследуется от класса управления, который вы хотите получить отрисовкой.

например:

Определите класс MyWidget, наследуемый от QWidget, а затем перепишите функцию paintEvent(QPaintEvent *) в этом классе и рисуйте в нем. Затем обновите соответствующий QWidget до MyWidget в пользовательском интерфейсе.

рекомендация

отblog.csdn.net/qq_58136559/article/details/130458427