前言

有时候,我们并不想派生一个类(可能是因为懒,毕竟要写cpp和h文件,还要重写它的paintEvent虚函数),可是父控件的paintEvent并不是你想用就能用的,因为它只属于父控件;那有没有一种办法,可以在父控件的类里边实现子控件的绘图呢?

介绍

我们需要对Qt的事件机制比较熟悉,比如paintEvent,它本质是一个QEvent::paint的事件;如果在事件队列里边拦截了QEvent::paint,再进行QPainter绘图,这个和paintEvent是一样的效果!

举例

这里的ui->dashboard1是一个QLabel,我们打算侦听它的事件

1
ui->dashboard1->installEventFilter(this);

重写父控件的eventFilter事件,侦听QEvent::Paint事件

1
2
3
4
5
6
7
bool MainWidget::eventFilter(QObject *obj, QEvent *evt)
{
if(obj == ui->dashboard1 && evt->type() == QEvent::Paint) {
this->drawArc(ui->dashboard1);
}
return QFrame::eventFilter(obj, evt);
}

子控件绘图:这里可以加入自定义的效果

1
2
3
4
5
6
7
8
9
void MainWidget::drawArc(QWidget *widget)
{
QPainter painter(widget);
painter.setRenderHint(QPainter::Antialiasing, true);
QPointF center(204, 204);
painter.setPen(Qt::NoPen);
painter.setBrush(Qt::red);
painter.drawEllipse(center, 3, 3);
}

© 2025 hywing 使用 Stellar 创建
总访问 113701 次 | 本页访问 326