2014-08-28 32 views

回答

2

这里是我会怎么做最简单的代码的第一个图像值。假设我画一个小部件的油漆事件:

#define PI 3.14159265 

[..] 

void Widget::paintEvent(QPaintEvent *event) 
{ 
    QPainter painter(this); 

    QPoint center = rect().center(); 
    painter.drawEllipse(center, 2, 2); 
    const int radius = 100; 
    // Draw semicircle with texts on every 30". 
    for (double i = .0; i <= 180.0; i += 30.0) { 
     QPoint p(center.x() + radius * cos(i * PI/180.0), 
       center.y() - radius * sin(i * PI/180.0)); 
     painter.drawText(p, QString::number(i)); 
    } 
} 
2

沿着任何路径绘制文本,而不公式

ArcCubic
使用创建路径
有一类QPainterPath您可以使用一堆方法绘制任何路径。
在你的情况下,可以使用arcTo

QPainterPath path; 
path.arcTo(rect, 210, -240.0); 

计算起点
有一点困难有:路径都有一个起点。如果您拨打arcTo,它会在弧线的开头创建一条线,然后绘制弧线。所以你需要调用moveTo并传递弧的起点作为参数。但是,你可以在哪里得到它?使用弧的公式计算?可以尝试并设置一个近似点或打开一本书并找到任何曲线的公式,但有一个简单的方法可以知道一个起点:绘制一个零尺寸曲线并获取它的最后一点:

QPainterPath initialPath; 
initialPath.arcTo(rect, 210, 0); 
path.moveTo(initialPath.currentPosition()); 

绘制文本
当你有这样的路径,你可以得到使用pointAtPercent路径上的任何点,并使用drawText绘制文本那里。
这里是一个代码,下面划弧线和编号:

QPainter p(this); 

    p.drawArc(rect(), 210 * 16, -240 * 16); 

    QRectF rect(20, 20, width() - 40, height() - 40); 

    QPainterPath initialPath; 
    initialPath.arcTo(rect, 210, 0); 

    QPainterPath path; 
    path.moveTo(initialPath.currentPosition()); 
    path.arcTo(rect, 210, -240.0); 

    for (int i = 0; i <= 10; i += 1) 
    { 
     p.drawText(path.pointAtPercent((qreal)i/10), QString::number(i)); 
    } 
相关问题