好的,在您发布该图像后,看起来您确实可以寻求更简单且有效的解决方案。
你的线条形成了一个可重复的图案,因此,绘制整个事物、手动管理线条等等都是一种浪费。您可以创建一个小的像素图并仅绘制重复图案的一段,如下所示:
然后根据方向,您可以保持原样或旋转/翻转它。然后你可以使用QPainter
来填补你的Graduation
小部件与它Qt::TexturePattern
using QBrush::setTexture(pixmap)
它会快速有效地用图案填充整个小部件的长度/高度,无论它有多少。
如果您想更改标尺的样式或间距,您所要做的就是重新绘制缓存的图案并使用相同的过程来更新标尺。
最后但并非最不重要的一点是,您可以使用 Qt 提供的布局将标尺固定到正确的位置,以便 100% 自动管理它们,从而使您当前使用的逻辑变得多余。
好的,这里有更多帮助,另外这将向您展示不必每条线都画线,代码很简单,并且将为给定的 DPI 生成图案段:
QPixmap drawCMPattern(qreal dpi) {
qreal dpcm = dpi / 2.54;
QPixmap rulerCache(dpcm, dpcm / 2);
rulerCache.fill();
qreal dpmm = dpcm / 10;
QPainter p(&rulerCache);
p.setRenderHint(QPainter::HighQualityAntialiasing);
qreal lineWidth = dpmm / 5;
p.setPen(QPen(Qt::black, lineWidth));
qreal xpos = lineWidth / 2;
for (int i = 0; i < 10; ++i) {
if (i == 0) p.drawLine(QLineF(xpos, 0, xpos, rulerCache.height()));
else if (i == 5) p.drawLine(QLineF(xpos, 0, xpos, rulerCache.height() / 2));
else p.drawLine(QLineF(xpos, 0, xpos, rulerCache.height() / 4));
xpos += dpmm;
}
return rulerCache;
}
您可能会注意到,在典型的低 DPI 桌面显示器上,线条有些模糊,但这就是您为实现“物理精确”而付出的代价 - 您要么是公制完美,要么是像素完美,除非您的 DPI 与公制单位匹配,否则您不能两者兼得。完美的是,大多数线条必然发生在像素之间。在高 DPI 移动设备上,它看起来不会那么糟糕。
或者,如果省略,您可以获得清晰的线条HighQualityAntialiasing
,但是这些线的距离将不相等。尽管如此,这可能对您有好处,因为它对于像 Photoshop 这样的商业软件来说显然已经足够好了:
然而,PS 比较棘手,1 厘米内的线条较少,因此差异并不像每毫米有一条线时那么明显。以下是该代码结果在我的 108.79 DPI 桌面上的外观: