我做了一个MCVE来解决这个问题。

因此,我使用的缩放比例小得多,无法重现该问题。 然后,我使用了OP所述的缩放比例1.0E14。 突然,线条图消失了。 降低缩放比例,我1E12说(以我1E12 )直到1E12效果很好,但缩放比例更高的线条开始消失。 玩弄这个时,一位同事走了,并暗示这可能只是浮点问题。 我们简短地讨论了这一点,并得出结论:

用非常大的数字乘以非常小的数字根本不是问题。 它由(整数)乘以尾数并加上指数组成。

大数与小数的加/减是一个问题,因为两个数必须使用相等的指数(通过移位尾数)进行加/减尾数。

因此,可能会发生后者,从而将非0值擦除为0。

10 14是二进制的47位数字。 这接近于53位尾数的double精度。 但是 :使用的QPainter渲染引擎可能基于OpenGL,其中float是很多东西的默认设置。 float仅提供尾数的23位!

因此,在对此进行了思考之后,我找到了不使用比例尺10 14进行绘制的充分理由。

为了证明这一点,我做了一个小样本testQPainterDrawLine.cc :

#include

class Widget: public QWidget {

public:

const double scale;

public:

Widget(double scale, QWidget *pQParent = nullptr):

QWidget(pQParent),

scale(scale)

{ }

virtual ~Widget() = default;

Widget(const Widget&) = delete;

Widget& operator=(const Widget&) = delete;

protected:

virtual void paintEvent(QPaintEvent *pQEvent) override;

};

void Widget::paintEvent(QPaintEvent*)

{

const double value = height() / scale;

QPainter qPainter(this);

qPainter.fillRect(0, 0, width(), height(), QColor(Qt::white));

qPainter.drawRect(0, 0, width() - 1, height() - 1);

QTransform xform;

xform.scale(1, scale);

qPainter.setTransform(xform);

qPainter.setPen(QPen(QColor(Qt::red), 3.0));

const double xL = 0.333 * width();

qPainter.drawLine(QPointF(xL, 0.0), QPointF(xL, value));

qPainter.setPen(QPen(QColor(Qt::blue), 3.0));

const double xPL = 0.667 * width();

QPointF qPts[] = { QPointF(xPL, 0.0), QPointF(xPL, value) };

const int nPts = sizeof qPts / sizeof *qPts;

qPainter.drawPolyline(qPts, nPts);

}

int main(int argc, char **argv)

{

qDebug() << "Qt Version:" << QT_VERSION_STR;

QApplication app(argc, argv);

QWidget qWin;

QGridLayout qGrid;

qGrid.setRowStretch(0, 0); qGrid.setRowStretch(1, 1);

double scale = 1.0E11;

for (int i = 0; i < 4; ++i, scale *= 10.0) {

qGrid.addWidget(

new QLabel(QString("Scale: %1").arg(scale)),

0, i);

qGrid.addWidget(new Widget(scale), 1, i);

}

qWin.setLayout(&qGrid);

qWin.resize(1024, 256);

qWin.show();

return app.exec();

}

testQPainterDrawLine.pro :

SOURCES = testQPainterDrawLine.cc

QT = widgets

$ qmake-qt5 testQPainterDrawLine.pro

$ make

$ ./testQPainterDrawLine

Qt Version: 5.9.4

所以,最后,我相信,这与QPainter::drawLine()与QPainter::drawPolyline()无关。 仅仅是缩放比例过高而导致浮点问题。 这就是线条可能意外出现的原因。

解决的办法是简单:值与拉伸之前被缩放QPainter ,以便在内部变换QPainter在量值接近于0和1发生。

qt中drawline函数的参数_c++ - Qt-drawPolyline和drawLine之间的区别 - 堆栈内存溢出相关推荐

  1. c语言sort函数排序二维数组,c++ - 如何使用stl sort函数根据第二列对二维数组进行排序? - 堆栈内存溢出...

    stl排序要求迭代器的rvalue作为参数传递. 如果你想使用sort函数,你必须在c ++ 11中编译并使用数组stl来存储数组. 代码如下 #include "bits/stdc++.h ...

  2. mysql中创建视图语法错误_mysql - 使用过程MySQL创建视图时出错 - 堆栈内存溢出

    尝试使用过程创建视图时出现问题. 我必须这样做,因为我需要在MySQL中发挥作用,将表的行转换为另一个表的列. 该查询效果很好,但是当我将其放在" CREATE VIEW"语句中时 ...

  3. cef使用缓存_c# - CefSharp清除缓存路径崩溃应用程序 - 堆栈内存溢出

    我正在使用以下代码在Winform应用程序中创建CefSharp浏览器: ChromiumWebBrowser browser = new ChromiumWebBrowser("" ...

  4. c2054未定义基类_c++ - 错误C2504:基类未定义 - 堆栈内存溢出

    我之前多次遇到过这个错误并最终找到了解决方案,但是这个让我难过. 我有一个由'Player'继承的类'Mob'. 这是Mob.h: #pragma once #include "PlaySt ...

  5. android和flask交互,java - 当我从Android向Flask Web服务发送参数时,如何解决“ SSL库故障”? - 堆栈内存溢出...

    我确实尝试将一些值作为" application / json "从Android应用程序发送到Flask Web服务. 这是我的Java代码 : Thread thread = ...

  6. html 弹框字体模糊,html - Chrome中的字体太模糊了 - 我该如何解决这个问题? - 堆栈内存溢出...

    我不认为这与所选字体有任何关系,尽管可能存在没有出现此错误的字体. 简而言之,问题的根源在于您为了获得十六进制形状而倾斜和平移两次. 从特定的技术角度来看,我认为只有熟悉Chrome渲染引擎工作原理的 ...

  7. QT中main函数中加载外部字体:OTF

    QT中main函数中加载外部字体:OTF 我们开发的程序中,如果想使用外部下载的开源字体,同时保证在软件发布时,程序字体能保证和开发者环境下一致,且不想通过安装字体方式实现字体跟随软件时,我们需要在代 ...

  8. linux中probe函数传递参数的寻找(下)

    点击打开链接 linux中probe函数传递参数的寻找(下) 通过追寻driver的脚步,我们有了努力的方向:只有找到spi_bus_type的填充device即可,下面该从device去打通,当两个 ...

  9. MFC开发IM-MFC中Arc函数的参数分别是什么意思

    MFC中Arc函数的参数分别是什么意思? 10 pDC->Arc(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4) MFC中Arc ...

  10. python中size的用法.dim_对于numpy中的函数的参数dim的一点理解

    对于numpy中的函数的参数dim的一点理解 经常被dim参数搞混.试着总结了一下.记忆瞬间清晰了 以.max(dim)方法为例: >>> import numpy as np &g ...

最新文章

  1. python中接口测试垃圾数据如何清理_一个六年经验的python后端是怎么学习用java写API的(2)Extracter,微信文章抓取清洗入库...
  2. Java Web 之Token+Cookie+Session
  3. chrome 调试 ios h5
  4. pycharm创建python虚拟环境好处_PyCharm虚拟环境创建Django2项目一些问题的解决方案...
  5. 能力不错的大厂高 P,为什么过不了小厂的试用期?
  6. 通过iOS 9 SFSafariViewController提供完整的Web浏览体验
  7. floquet端口x极化入射波_hfss和cst电磁媒质色散曲线dispersiondiagram研究方法.pdf
  8. 【Java 8 新特性】Java Consumer示例
  9. 使用kubeasz自动化部署K8s
  10. vbs脚本打开web窗口隐藏地址栏和工具栏
  11. unity 视频录制总结
  12. PHP 垃圾回收机制
  13. html5 龙,百度移动可搜龙点睛 技术创新挺进HTML5元年
  14. 安卓android记单词软件
  15. uni-app 实现在做下一个请求时中止当前的请求
  16. 木马冰河之原理篇(深入浅出看木马)
  17. python在日常的一些用处
  18. Tomcat是什么。Tomcat入门介绍
  19. 光流文件(.flo)转图像
  20. 从删除到坐牢,这个锅背不动

热门文章

  1. 电脑连接ios开发配置
  2. 计算机科学与技术职业规划1000字,计算机职业生涯规划书1000字
  3. ps批量修改名片文字_PS批量制作多项字幕条
  4. DSP之CCS软件使用一
  5. 基于Java+SpringBoot+vue+elementui农产品物流系统详细设计实现
  6. 非常逆天的六款Photoshop插件!
  7. CAD制图初学入门:CAD图案填充之图案加洞
  8. tracepro中文pojie版-tracepro附安装教程
  9. 《麦肯锡方法》读书笔记4
  10. 计算机职业素养论文1500字,职业素养论文1500字 [职业素养教育论文]