【问题标题】:How to draw over an existing dotted line with a wider one?如何用更宽的虚线绘制现有的虚线?
【发布时间】:2020-10-24 02:49:01
【问题描述】:

我想在现有的虚线(左黑色)上绘制一条圆石线(右绿色)来模拟选择效果,
但粗线的笔画与原始笔画不对齐
即使它们是使用相同的起点/终点p1p2 绘制的:

代码如下:

const QPointF p1{};
const QPointF p2{};

// draw thin black line
QPen blackPen;
blackPen.setWidth(10);
blackPen.setColor(Qt::black);
blackPen.setStyle(Qt::DotLine);

painter->setPen(blackPen);
painter->setBrush(Qt::NoBrush);
painter->drawLine(p1, p2);

// draw bold green line using the same points
QPen boldGreenPen;
boldGreenPen.setWidth(12);
boldGreenPen.setColor(Qt::green);
boldGreenPen.setStyle(Qt::DotLine);

painter->setPen(boldGreenPen);
painter->setBrush(Qt::NoBrush);
painter->drawLine(p1, p2);

是否有可能实现期望的行为?

【问题讨论】:

    标签: c++ qt qpainter qpen


    【解决方案1】:

    根据Qt docs

    虚线图案以笔宽为单位指定

    这意味着我们必须像这样计算两条线的宽度之间的比率:

    QPen pen;
    const double penWidth(pen.widthF());
    const auto penDashPattern(pen.dashPattern());
    
    QPen boldPen(pen);
    const double boldPenWidth(penWidth + 2);
    auto boldPenDashPattern(boldPen.dashPattern());
    
    const double ratio(penWidth / boldPenWidth);
    for (auto & pattern : boldPenDashPattern)
    {
        pattern *= ratio;
    }
    
    boldPen.setWidthF(boldPenWidth);
    boldPen.setDashPattern(boldPenDashPattern);
    
    painter->setPen(boldPen);
    

    这给了我们想要的结果

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-08
      • 2010-10-07
      • 1970-01-01
      • 1970-01-01
      • 2021-01-24
      • 1970-01-01
      • 2015-02-22
      • 2012-09-23
      相关资源
      最近更新 更多