painter qt 好恶心_Qt 中QPainter 使用中出现的问题

这两天在使用QPainter的过程中出现了一些问题,记录一下。

测试程序很简单,写一个继承自QWidget的类,重载其paintEvent函数进行绘图。

2116e35bbb2c79bd9afe5663c5889a50.png

case1:

在paintEvent函数中使用一个临时的painter对象进行绘制。

53ecdbd5e3e77c7072e107e0fe25ecdd.png

结果:能够正常绘制。

case2:

在paintEvent函数中动态分配一个painter对象进行绘制。

fb9808e87f57e336132f74374bc0f1ab.png

结果:能够正常绘制。

case3:将Painter声明为一个类的成员变量进行绘制。

2fecd2e64ffa7fa0571da293bfd8e170.png

233f2ad5bc91794ec9077d42804a0b31.png

d33a1fcf0c4f0efe69b43771f0feb2d9.png

结果:不能正常绘制

a64fbfb7ba03d54182b392476296c834.png

分析:由于我在初始化m_painter时,用到的是QPainter m_painter(this);

这句代码等于QPainter m_painter,m_painter.begin(this);

但是m_painter.begin()函数只有在paintEvent()函数中调用才是有意义的(Qt中的绘制动作只能在paintEvent()函数中完成)

由于此时begin()函数隐式在构造函数中被调用了,最终倒是绘图动作失效。

试探的解决办法:在用不带参数的构造函数初始化painter,然后再paintEvent函数中利用begin函数为painter绑定对象。

0d726e35bdbb5babe3b7d792ba5d5085.png

42f6e43537b7a05fcc6b4212d4bce717.png

试探的解决方法的结果;窗体先是正常绘制,接着就崩溃了,并报出如下错误:

4d6568a9c5fabeffe1c913abf516ca41.png

我原本的思路是:当MyWidget对象析构是,就会自动调用其内部成员变量painter的析构函数,所以我就没有显式的嗲用end()函数,因为我希望painter对象能够在MyWidget的声明周期中一直存在。

结果:程序提醒我在绘制完成后必须调用end()函数,难道QPainter对象是一个一次性消耗品,用完一次就得扔?

果然,当加上end()代码后,程序就没问题了。

5510aba31f88050825dea43c4bce81c8.png

但是,调用end()函数中,m_painter对象就等于析构了。当我第二次进行绘制动作时,会不会出现问题?

结果是并不会,因此当进行隐藏以及重现窗体,更改窗体大小这些动作时(这些动作都会触发窗体的重绘操作),窗体并没有崩溃。

这里我有点疑惑,难道时begin()函数为m_painter重新分配了资源?可按理来说,已经析构的对象时无法再次使用的。。

Qt的文档上并没有相关的解答。

c86a2d629c5deb984e5ab842395368cf.png

edfb8d1cb36508ad9c18fa4f19714a2f.png

总之:从这个例子中我可以体会到painter的构造析构函数与begin()end()函数是有区别的。

case4:以一个QPainter对象的指针作为类成员变量,为这个指针分配资源。

如是在构造函数中以带参数的构造函数来初始化QPainter对象,依然会出现上面的错误。

edebd2f60adf54fe44cd61dc264c5ee9.png

44ab40098916e2c85cfb1b6612ecb58b.png

30efca5a5c98e2cc97430136e1077a5b.png

一个尝试:我故意不用end()函数结束绘制,而选择delete掉m_painter;

808c9c2cf23d7757350b46b1beb5b49e.png

程序果然崩溃了:

总结:end()函数和delete是有区别的,end()之后还能再begin(),在delete之后,该对象就彻底消失了。

小小感触:最好还是将QPainter对象当成一个一次消耗品来用吧,即在需要绘图时创建一个临时的QPainter对象来进行绘制。

原文:https://www.cnblogs.com/XiaoXiaoShuai-/p/12201324.html

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值