Qt使用QPainter在子控件上绘图

因为Qt存在事件过滤机制,事件过滤器会将子控件上的绘图事件过滤,因此无法在子控件上使用QPainter进行绘图

如果需要在子控件上使用QPainter,同样需要事件过滤器

事件过滤器

事件过滤器与其他部件不同,它不是一个类,只是由两个函数组成的一种操作

用来完成一个部件对其他部件的事件监视,这两个函数分别是installEventFilter()和eventFilter(QObject *obj, QEvent *ev),都是QObject类中的函数

使用步骤:

  • 安装事件过滤器: ui->paint_widget(子控件名,可更换为需要使用的控件)->installEventFilter(this);
  • 实现在过滤器中指定的操作

事件过滤器的实现(具体代码):

bool MainWindow::eventFilter(QObject *watched, QEvent *event)
{
if(watched == ui->paint_widget && event->type() == QEvent::Paint)
{
showPaint(); //响应函数
}
return QWidget::eventFilter(watched,event);
}

//实现响应函数
void MainWindow::showPaint()
{
QPainter painter(ui->paint_widget);
painter.setPen(Qt::gray);
painter.setBrush(Qt::green);
painter.drawRect(10,10,200,200);
}