QT开发中文网

void GaugeArc::drawArc(QPainter *painter) { int radius = 98; painter->save(); QPen pen; pen.setColor(arcColor); pen.setWidthF(2); painter->setPen(pen); painter->setBrush(Qt::NoBrush); //计算总范围角度,当前值范围角度,剩余值范围角度 ...

您的 drawArc 函数实现了一个弧形仪表的绘制,使用 QPainter 进行图形绘制。这个函数计算并绘制了两个不同半径的圆弧,表示当前值和剩余值。

下面是对代码中几个重要部分的详细说明,以及一些潜在问题的纠正:

代码分析

  1. 初始化与保存状态: “`cpp painter->save(); QPen pen; pen.setColor(arcColor); pen.setWidthF(2);

painter->setPen(pen); painter->setBrush(Qt::NoBrush);

   - 首先,保存当前的绘图状态。
   - 设置画笔颜色和宽度,并设置画刷为无(透明)。

2. **计算角度**:
   ```cpp
   double angleAll = 360.0 - startAngle - endAngle;
   double angleCurrent = angleAll * ((currentValue - minValue) / (maxValue - minValue));
   double angleOther = angleAll - angleCurrent; // 修复变量名称错误
  1. 绘制外边框圆弧:

    QRectF rect = QRectF(-radius, -radius, radius * 2, radius * 2);
    painter->drawArc(rect, (270 - startAngle - angleCurrent) * 16, angleCurrent * 16);
    painter->drawArc(rect, (270 - startAngle - angleCurrent - angleOther) * 16, angleOther * 16);
    
  2. 绘制内边框圆弧:

    radius = 90;
    rect = QRectF(-radius, -radius, radius * 2, radius * 2);
    painter->drawArc(rect, (270 - startAngle - angleCurrent) * 16, angleCurrent * 16);
    painter->drawArc(rect, (270 - startAngle - angleCurrent - angleOther) * 16, angleOther * 16);
    
  3. 恢复状态:

    painter->restore();
    

潜在问题及修复

  • 在计算 angleOther 的时候,您写成了 cangleCurrent,这是一个拼写错误。它应该是 angleCurrent

  • 如果 currentValue 小于 minValue 或大于 maxValue,可能会导致不合理的结果。在使用这些值之前可以添加条件检查,以避免除以零或产生负角度。

  • 对于起始和结束角度 (startAngle, endAngle) 的定义,需要确保这些值适当地定义,以确保它们不会使总范围角度变为负数。

示例改进

以下是修正后的代码示例:

void GaugeArc::drawArc(QPainter *painter)
{
    int radius = 98;
    painter->save();
    
    QPen pen;
    pen.setColor(arcColor);
    pen.setWidthF(2);

    painter->setPen(pen);
    painter->setBrush(Qt::NoBrush);

    // 确保 currentValue 在有效范围内
    if (currentValue < minValue || currentValue > maxValue)
        return;

    //计算总范围角度以及当前和剩余值范围角度
    double angleAll = 360.0 - startAngle - endAngle;
    
    // 避免除以零的情况 
    if (maxValue != minValue) {
        double ratio = (currentValue - minValue) / (maxValue - minValue);
        double angleCurrent = angleAll * ratio;
        double angleOther = angleAll - angleCurrent;

        // 绘制外边框圆弧
        QRectF rect = QRectF(-radius, -radius, radius * 2, radius * 2);
        painter->drawArc(rect, (270.0 - startAngle) * 16, -(angleCurrent) * 16); // 改为负号以适应Qt坐标系方向

        // 绘制里边框圆弧
        radius = 90;
        rect = QRectF(-radius, -radius, radius * 2, radius * 2);
        painter->drawArc(rect, (270.0 - startAngle) * 16 , -(angleCurrent) * 16); // 同样应用负号

      }
      
      painter->restore();
}

注意事项:

  • Qt 的坐标系统与数学坐标系统相反,因此需要根据需求调整绘制顺序及方向。
  • 请根据实际需求调整起始和结束角度、弧线颜色等参数。


    内容由零声教学AI助手提供,问题来源于学员提问
目录导航
  • 代码分析
  • 潜在问题及修复
  • 示例改进
  • 注意事项:
  • 本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
    转载请注明出处:https://qt.0voice.com/?id=13207

    分享:
    扫描分享到社交APP
    上一篇
    下一篇
    发表列表
    游客 游客
    此处应有掌声~
    评论列表

    还没有评论,快来说点什么吧~

    联系我们

    在线咨询: 点击这里给我发消息

    微信号:3007537140

    上班时间: 10:30-22:30

    关注我们
    x

    注册

    已经有帐号?