метод первый:
Использовать механизм фильтрации событий
Фильтр событий:
Операция, состоящая из двух функций, используемых для завершения мониторинга событий компонента для других компонентов, две функции: 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 в пользовательском интерфейсе.