Qt 编程点滴 初学者必看 (7)
创始人
2024-08-01 02:20:27
0

Qt 编程继续为大家讲解,还是接着文章 Qt 编程点滴 初学者必看 (6) ,继续介绍,说编程那些细节。由于本话题是一节一节为大家介绍的,所以更多内容请看末尾编辑推荐。本文基本是用代码实现的效果,所以并没有太多的内容。

QPainterPath 画出的图形会闪烁的问题:

用下面的写法画出的图形会闪烁

  1. class MyClass: public QWidget  
  2. {  
  3. public:  
  4.   MyClass(QWidget*);  
  5. private:  
  6.     QPainterPath* route;  
  7.     void paintEvent(QPaintEvent*e);  
  8. };  
  9. MyClass::MyClass()  
  10. {  
  11.   route = new QPainterPath();  
  12. }  
  13. void MyClass::paintEvent( QPaintEvent*e)  
  14. {  
  15.     QPainter *painter = new QPainter(this);  
  16.     //画校正图形  
  17.     int insideR = 30;  
  18.     int outsideR = 50;  
  19.     QColor insideColor(237,29,12); //内圆线条颜色  
  20.     QColor outSideColor(237,29,12); //外圆线条颜色  
  21.     QColor lineColor(237,29,12); //直线颜色  
  22.     QColor insideBrushColor(255,0,0,25);//内圆画刷颜色,最后的参数代表透明度( 0(完全透明)-100(不透明) )  
  23.     QColor outsideBrushColor(255,0,0,50);//外圆画刷颜色,最后的参数代表透明度( 0(完全透明)-100(不透明) )  
  24.  
  25.     //QPainterPath path;  
  26.     route->moveTo(insideR,0);  
  27.     route->lineTo(outsideR,0);  
  28.     route->arcTo(0-outsideR,0-outsideR,outsideR*2,outsideR*2,0,180);  
  29.     route->lineTo(0-insideR,0);  
  30.     route->arcTo(0-insideR,0-insideR,insideR*2,insideR*2,0,180);  
  31.     route->moveTo(0-insideR,0);  
  32.     route->lineTo(0-outsideR,0);  
  33.     route->arcTo(0-outsideR,0-outsideR,outsideR*2,outsideR*2,180,180);  
  34.     route->lineTo(insideR,0);  
  35.     route->arcTo(0-insideR,0-insideR,insideR*2,insideR*2,180,180);  
  36.     painter->setPen(Qt::NoPen);  
  37.     painter->setBrush(outsideBrushColor);  
  38.     painter->drawPath(*route);  
  39.  
  40.     painter->setBrush(Qt::NoBrush);  
  41.     painter->setPen(outSideColor);  
  42.     painter->drawEllipse( QPointF(0,0),outsideR,outsideR );  
  43.     painter->setBrush(insideBrushColor);  
  44.     painter->setPen(insideColor);  
  45.     painter->drawEllipse( QPointF(0,0),insideR,insideR );  
  46.     painter->setPen(lineColor);  
  47.     QPoint p1(0,  0- outsideR - 10  );  
  48.     QPoint p2(0,  outsideR + 10  );  
  49.     painter->drawLine(p1,p2);  
  50.     painter->rotate(90);  
  51.     painter->drawLine(p1,p2);  
  52.     painter->rotate(-90);  
  53.     delete painter;  

如下用下面的写法则不会闪烁:

  1. void MyClass::paintEvent( QPaintEvent*e)  
  2. {  
  3.     QPainter *painter = new QPainter(this);  
  4.     //画校正图形  
  5.     int insideR = 30;  
  6.     int outsideR = 50;  
  7.     QColor insideColor(237,29,12); //内圆线条颜色  
  8.     QColor outSideColor(237,29,12); //外圆线条颜色  
  9.     QColor lineColor(237,29,12); //直线颜色  
  10.     QColor insideBrushColor(255,0,0,25);//内圆画刷颜色,最后的参数代表透明度( 0(完全透明)-100(不透明) )  
  11.     QColor outsideBrushColor(255,0,0,50);//外圆画刷颜色,最后的参数代表透明度( 0(完全透明)-100(不透明) )  
  12.     QPainterPath path;  
  13.     path.moveTo(insideR,0);  
  14.     path.lineTo(outsideR,0);  
  15.     path.arcTo(0-outsideR,0-outsideR,outsideR*2,outsideR*2,0,180);  
  16.     path.lineTo(0-insideR,0);  
  17.     path.arcTo(0-insideR,0-insideR,insideR*2,insideR*2,0,180);  
  18.     path.moveTo(0-insideR,0);  
  19.     path.lineTo(0-outsideR,0);  
  20.     path.arcTo(0-outsideR,0-outsideR,outsideR*2,outsideR*2,180,180);  
  21.     path.lineTo(insideR,0);  
  22.     path.arcTo(0-insideR,0-insideR,insideR*2,insideR*2,180,180);  
  23.     painter->setPen(Qt::NoPen);  
  24.     painter->setBrush(outsideBrushColor);  
  25.     painter->drawPath(path);  
  26.     painter->setBrush(Qt::NoBrush);  
  27.     painter->setPen(outSideColor);  
  28.     painter->drawEllipse( QPointF(0,0),outsideR,outsideR );  
  29.     painter->setBrush(insideBrushColor);  
  30.     painter->setPen(insideColor);  
  31.     painter->drawEllipse( QPointF(0,0),insideR,insideR );  
  32.     painter->setPen(lineColor);  
  33.     QPoint p1(0,  0- outsideR - 10  );  
  34.     QPoint p2(0,  outsideR + 10  );  
  35.     painter->drawLine(p1,p2);  
  36.     painter->rotate(90);  
  37.     painter->drawLine(p1,p2);  
  38.     painter->rotate(-90);  
  39.     delete painter;  

小结:本文主要介绍了在Qt 窗体的使用,通过Qt 编程点滴介绍,也给自己提高了编程过程中需要注意的细节问题,由于本话题是一节一节为大家展现的,所以更多内容,请看编辑推荐。

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...