c++ - 为什么 QPainter 在一个轴上缩放(装饰)点,尽管它们不应该受到影响?
问题描述
我在我的 Qt 应用程序中绘制线条和点,并且遇到了 QPainter 中看起来像缩放错误的问题。我的线条工作得很好,但点会受到某些比例的转换的影响,尽管笔设置为“化妆品”。最困扰我的是,似乎只有一个轴(x 轴)受到影响。否则,我可以将其归结为转换/矩阵代码中的一些浮点精度问题。
Qt 版本:嵌入式 Qt 4.8,桌面 Qt 5.4,桌面Qt 5.6 LTS
以下是一些实际上应该看起来都一样的效果图(就像最左边的一样):
我有一个从 QWidget 派生的 RenderArea ,它只是绘制上面的图像之一。RenderArea 在 main() 中简单地实例化并显示。那里的代码很简单,所以这里是相关的绘画代码:
void RenderArea::paintEvent(QPaintEvent* /* event */)
{
const qreal scaleFactor = 0.01;
// Define a "unit" square
std::vector<QPointF> points;
points.push_back(QPointF(0, 0));
points.push_back(QPointF(1.0, 0));
points.push_back(QPointF(1.0, 1.0));
points.push_back(QPointF(0, 1.0));
// Build a scaled version of the points
for (unsigned i = 0; i < points.size(); i++) {
points[i] *= scaleFactor;
}
QPainter painter(this);
painter.save();
// Scale the painter so that every square takes 100 pixels
// in screen space regardless of the scaleFactor:
painter.scale(100.0 / scaleFactor, 100.0 / scaleFactor);
QPen pointPen(Qt::blue, 10);
pointPen.setCosmetic(true);
painter.setPen(pointPen);
painter.drawPoints(points.data(), points.size());
QPen linePen(Qt::red, 5);
linePen.setCosmetic(true);
painter.setPen(linePen);
painter.drawPolyline(points.data(), points.size());
painter.restore();
}
该示例基于 Qt 附带的 basicdrawing 示例,但我剥离了所有内容以突出问题。
- 为什么会出现这个问题?
- 为什么它只出现在一个轴上?
解决方案
要结束这个话题,我想添加对另一个 stackoverflow 问题的引用: 为什么 QPainter::drawPoint 绘制水平线段?
这似乎是这里提交的 Qt 中的一个错误: QPainter::drawPoints draws line segments instead of points
正如评论中指出的那样,可以通过编写自己的绘图点代码、修补 Qt、绘制图像而不是点或使用 drawEllipse 来克服这个错误。
推荐阅读
- python-3.x - 使用 numpy 将数据从 csv 加载到单个列表
- google-identity - 未显示 Web 密码凭据的一个选项卡登录
- javascript - 通过 beforeunload 捕获关闭窗口但排除 asp 按钮
- javascript - 如何使用 jquery 启用克隆 div?
- laravel - Laravel 的虚拟主机配置不重定向到公用文件夹
- mysql - 颤振:将 json 实现为列表返回一个空列表
- html - 如何以编程方式添加
每个段落的标签?
- laravel - Laravel 从父类调用 Artisan 命令的方法
- python - 如何使用 islice,从 fasta 文件中切出确切数量的记录
- python - 我的 tkinter 窗口与我想要的按钮不匹配