• 14065阅读
  • 14回复

如何用QT画出一个五角星啊? [复制链接]

上一主题 下一主题
离线alexelle
 
只看楼主 倒序阅读 楼主  发表于: 2007-02-01
— 本帖被 XChinux 执行加亮操作(2008-07-26) —
我想画一个五角星,应该用什么函数啊?谢谢了
离线XChinux

只看该作者 1楼 发表于: 2007-02-01
好像没有这个函数吧!自己写函数画线吧。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线zbluecn

只看该作者 2楼 发表于: 2007-02-01
好像是72度 相一个方向旋转4次
离线hehui

只看该作者 3楼 发表于: 2007-04-16
Demo里有!
离线robertkun

只看该作者 4楼 发表于: 2009-06-10
引用第3楼hehui于2007-04-16 21:21发表的  :
Demo里有!


哪个里面有呢,我想用path 画,可是感觉有这个方法有点笨。。
                                              简单的生活使人快乐!
离线duduqq

只看该作者 5楼 发表于: 2009-06-11
这是用路径画的,searchlightRect是一个矩形区域,这个五角星大小就是这个区域的大小

pentagonPath.moveTo(searchlightRect.x()+searchlightRect.width()/2 , searchlightRect.y()) ;
        pentagonPath.lineTo(searchlightRect.x()+searchlightRect.width()/3 , searchlightRect.y() + searchlightRect.height()*0.36) ;
        pentagonPath.lineTo(searchlightRect.x(), searchlightRect.y() + searchlightRect.height()*0.36) ;
        pentagonPath.lineTo(searchlightRect.x()+searchlightRect.width()/4 , searchlightRect.y()+searchlightRect.height()*14/24) ;
        pentagonPath.lineTo(searchlightRect.x()+searchlightRect.width()*0.19 , searchlightRect.y()+searchlightRect.height()) ;
        pentagonPath.lineTo(searchlightRect.x()+searchlightRect.width()/2 , searchlightRect.y()+searchlightRect.height()*18/24) ;
        pentagonPath.lineTo(searchlightRect.x()+searchlightRect.width()*0.81 , searchlightRect.y()+searchlightRect.height()) ;
        pentagonPath.lineTo(searchlightRect.x()+searchlightRect.width()*3/4 , searchlightRect.y() + searchlightRect.height()*14/24) ;
        pentagonPath.lineTo(searchlightRect.x()+searchlightRect.width() , searchlightRect.y()+searchlightRect.height()*0.36) ;
        pentagonPath.lineTo(searchlightRect.x()+searchlightRect.width()*2/3 , searchlightRect.y()+searchlightRect.height()*0.36) ;
        pentagonPath.closeSubpath();
离线robertkun

只看该作者 6楼 发表于: 2009-06-11
帅,这你也想的出来。。

我试试先。。


这是我用你的方法画出来的五星。

但是感觉和Demo中的方法画出来的不同,

QPainterPath starPath;

starPath.moveTo(90, 50);

for (int i = 1; i < 5; ++i) {

starPath.lineTo(50 + 40 * cos(0.8 * i * Pi),

50 + 40 * sin(0.8 * i * Pi));

}

starPath.closeSubpath();

请问这个方法能不能和矩形联系到一起呢?

不明白这句话的意思:
starPath.lineTo(50 + 40 * cos(0.8 * i * Pi),

50 + 40 * sin(0.8 * i * Pi));
[ 此帖被robertkun在2009-06-11 18:15重新编辑 ]
                                              简单的生活使人快乐!
离线sbtree
只看该作者 7楼 发表于: 2009-06-11
就是计算5个点,按图中的顺序画首尾相连的直线
windows 7 + VC++2008 + Qt4.5.2
离线duduqq

只看该作者 8楼 发表于: 2009-06-12
我画五角形是要做一个五角星的不规则窗体,DEMO是画一个五角星。
例子那个一样可能和矩形关联在一起的,就是50 和40那两个值,就是长与宽了。
试试看吧
离线robertkun

只看该作者 9楼 发表于: 2009-06-12
引用第8楼duduqq于2009-06-12 13:45发表的  :
我画五角形是要做一个五角星的不规则窗体,DEMO是画一个五角星。
例子那个一样可能和矩形关联在一起的,就是50 和40那两个值,就是长与宽了。
试试看吧


哈哈,这个我得试试,再谢谢。

对了,starPath.moveTo(90, 50);
这个起始值是怎样确定的呢,本菜菜对坐标系理解不太深刻。。
                                              简单的生活使人快乐!
离线wuleeemail

只看该作者 10楼 发表于: 2009-06-12
请问:如果画完以后要给这五条线上颜色,怎么办?
离线robertkun

只看该作者 11楼 发表于: 2009-06-15
顶一个。。哈哈

估计要置PATH 的属性吧。。
                                              简单的生活使人快乐!
离线allblue

只看该作者 12楼 发表于: 2009-06-16
来个 image 放到容器里,调入预先画好的图片,然后将图片的相应部分设置 keyColor 透明,这样也可以出来不规则窗体,而且如果想换形状的话,只要换一下图片就可以了,嘿嘿,不知道行不行。
黑暗魔法
离线robertkun

只看该作者 13楼 发表于: 2009-06-16
噢 ,NO ,这样图形的大小就不能改变了。。
                                              简单的生活使人快乐!
离线robertkun

只看该作者 14楼 发表于: 2009-11-25
  1.     QPainterPath path;
  2.     QRectF rect = m_rect;
  3.     QVector<QPointF> pointVec;
  4.     double dAngle = 90;            // 角度, 初始化为正上方
  5.     for ( int i = 0; i < 5; i++) {
  6.         QPointF point;
  7.         qreal x = rect.width()/2.0 * ( 1 + cos( dAngle / 180 * PI ) );
  8.         point.setX(x);
  9.         qreal y = rect.height()/2.0 * ( 1 - sin( dAngle / 180 * PI ) );
  10.         point.setY(y);
  11.         pointVec.push_back(point);
  12.         // 计算下一个点
  13.         dAngle += 360 / 5 * 2;            // 如果不*2,那么结果是一个五边形,不是五角星
  14.         if ( dAngle > 360 ) {
  15.             dAngle -= 360;
  16.         }
  17.     }
  18.     for(int i=0; i<5;i++)
  19.     {
  20.         QPointF poi = pointVec.at(i);
  21.         path.lineTo(poi);
  22.     }
  23.     path.lineTo(pointVec.first());
  24.     path.closeSubpath();
  25.     setPath(path);
                                              简单的生活使人快乐!
快速回复
限100 字节
 
上一个 下一个