Qt之在控件上绘图

本文介绍了在Qt中如何实现在控件上绘图,由于Qt事件过滤器默认过滤子控件的绘图事件,因此需要通过自定义控件或使用事件过滤器来解决。文中提供了两种解决方案:一是创建自定义控件并重写paintEvent函数;二是利用事件过滤器在事件分发前处理子控件的绘图事件,以实现画图和清除功能。
摘要由CSDN通过智能技术生成

1.总述

Qt的要在当前类对应的窗口上绘图一般需要重写paintEvent函数,但是Qt的事件过滤器默认是把父窗口下子控件的绘图事件给过滤了的,因此重写父窗口的paintEvent函数是无法在子控件上进行绘图的,下面举一个例子。

  void MainWindow::myDraw(QLabel * label)
  {
      QPainter painter(label);
      painter.setPen(Qt::gray);
      painter.setBrush(Qt::green);
      painter.drawRect(10,10,20,20);
  }
  
  void MainWindow::paintEvent(QPaintEvent *)
 {
     myDraw(ui->label);
     myDraw(ui->label_2);
 }

如上所示,重写MainWindow的paintEvent(QPaintEvent *)函数,然后在里面对子控件绘图是没有用的。

2.解决方案

还是以上面的例子为例。

法一

自己定义一个Mylabel类继承于QLabel,然后在这个类中重写paintEvent(QPaintEvent *)函数,并在里面绘图。然后在ui界面中把对应的QLabel提升为Mylabel。这种方式不是很灵活,因此不多介绍,详见https://blog.csdn.net/seanwang_25/article/details/18667871。

法二

在介绍法二之前,先补充一下qt中的事件机制,qt程序需要在main()函数创建一个QApplication对象,然后调用它的exec()函数。这个函数就是开始 Qt 的事件循环。在执行exec()函数之后,程序将进入事件循环来监听应用程序的事件(鼠标事件,键盘事件,绘图事件等)。当事件发生时,Qt 将创建一个事件对象。Qt 中所有事件类都继承于QEvent。在事件对象创建完毕后,Qt 将这个事件先传给事件过滤器:

virtual bool QObject::eventFilter ( QObject * watched, QEvent * event );

在事

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值