关于用QPainter画过大的图片出现问题的原因
2014-02-26 14:52
597 查看
起源
CSDN上有网友问到:
在qpixmap(40000,100)上画图到x=32768之后就画不出来了怎么办验证
写段代码测试一下:
import sys
from PySide import QtCore, QtGui
app = QtGui.QApplication(sys.argv)
pix = QtGui.QPixmap(40000, 100)
p = QtGui.QPainter(pix)
p.setPen(QtCore.Qt.red)
p.drawLine(0, 50, 40000, 50)
pix.save("abcd.png")
sys.exit(app.exec_())
结果确实如网友所说:一条直线,无故终止了。
原因
原因何在呢?打开google,搜索,再搜索,依然无果。于是,还是看源码吧:
Qt 的 Paint System 由三部分构成
QPainter
QPaintEngine
QRasterPaintEngine
QPaintDevice
QPixmap
对我们这个情况来说,QPainter 不用多说,QPixmap 是 QPaintDevice 的派生类,也容易理解。唯独 QPaintEngine 比较隐蔽, 我们这儿关注的是它的派生类 QRasterPaintEngine
$QTDIR/src/gui/painting/qpaintengine_raster.cpp
函数调用 关系:
QPainter::QPainter(QPaintDevice *pd)
bool QPainter::begin(QPaintDevice *pd)
bool QRasterPaintEngine::begin(QPaintDevice *device)
void QRasterPaintEnginePrivate::systemStateChanged()
看看 systemStateChanged() 的代码:
void QRasterPaintEnginePrivate::systemStateChanged()
{
QRect clipRect(0, 0,
qMin(QT_RASTER_COORD_LIMIT, device->width()),
qMin(QT_RASTER_COORD_LIMIT, device->height()));
if (!systemClip.isEmpty()) {
QRegion clippedDeviceRgn = systemClip & clipRect;
deviceRect = clippedDeviceRgn.boundingRect();
baseClip->setClipRegion(clippedDeviceRgn);
} else {
deviceRect = clipRect;
baseClip->setClipRect(deviceRect);
}
...
}
发现什么没?有一个宏出现了 QT_RASTER_COORD_LIMIT,其数值为 32767
这样一来,PainterEngine 中的设备大小始终不会超出这个值,而 QPainter 要通过 PainterEngine 实现在 QPainteDevice 中的图线绘制。于是,结果就是我们一开始所看到的了。
看来出了问题一味的求助于google是不够的,有时反而会浪费很多时间,查看源码往往是最直接,最快的方法
CSDN上有网友问到:
在qpixmap(40000,100)上画图到x=32768之后就画不出来了怎么办验证
写段代码测试一下:
import sys
from PySide import QtCore, QtGui
app = QtGui.QApplication(sys.argv)
pix = QtGui.QPixmap(40000, 100)
p = QtGui.QPainter(pix)
p.setPen(QtCore.Qt.red)
p.drawLine(0, 50, 40000, 50)
pix.save("abcd.png")
sys.exit(app.exec_())
结果确实如网友所说:一条直线,无故终止了。
原因
原因何在呢?打开google,搜索,再搜索,依然无果。于是,还是看源码吧:
Qt 的 Paint System 由三部分构成
QPainter
QPaintEngine
QRasterPaintEngine
QPaintDevice
QPixmap
对我们这个情况来说,QPainter 不用多说,QPixmap 是 QPaintDevice 的派生类,也容易理解。唯独 QPaintEngine 比较隐蔽, 我们这儿关注的是它的派生类 QRasterPaintEngine
$QTDIR/src/gui/painting/qpaintengine_raster.cpp
函数调用 关系:
QPainter::QPainter(QPaintDevice *pd)
bool QPainter::begin(QPaintDevice *pd)
bool QRasterPaintEngine::begin(QPaintDevice *device)
void QRasterPaintEnginePrivate::systemStateChanged()
看看 systemStateChanged() 的代码:
void QRasterPaintEnginePrivate::systemStateChanged()
{
QRect clipRect(0, 0,
qMin(QT_RASTER_COORD_LIMIT, device->width()),
qMin(QT_RASTER_COORD_LIMIT, device->height()));
if (!systemClip.isEmpty()) {
QRegion clippedDeviceRgn = systemClip & clipRect;
deviceRect = clippedDeviceRgn.boundingRect();
baseClip->setClipRegion(clippedDeviceRgn);
} else {
deviceRect = clipRect;
baseClip->setClipRect(deviceRect);
}
...
}
发现什么没?有一个宏出现了 QT_RASTER_COORD_LIMIT,其数值为 32767
这样一来,PainterEngine 中的设备大小始终不会超出这个值,而 QPainter 要通过 PainterEngine 实现在 QPainteDevice 中的图线绘制。于是,结果就是我们一开始所看到的了。
看来出了问题一味的求助于google是不够的,有时反而会浪费很多时间,查看源码往往是最直接,最快的方法
相关文章推荐
- 关于图片失真的问题及问题出现的原因
- 关于jsp乱码问题的解决。和出现原因
- 关于Android7.0版本及其以上系统获取本地数据(图片和文件)报系统出现异常,正在退出问题
- 关于ViewPager使用出现的图片覆盖错误问题
- 关于 eclipse项目 导入 android studio 中 出现的图片报错问题解决。
- 关于上传图片出现乱码的问题
- 关于winForm界面控件和图片加载时出现闪屏的问题
- Android webview解决图片过大出现水平滚动条的问题
- 【史上最简单】android硬件加速——关于图片过大无法显示,直接变黑色问题
- 关于Genymotion出现“An error occured while deploying the file.INSTALL_FAILED_INVALID_URI”问题的原因分析
- 关于Glide加载圆形图片,第一次加载时出现不显示的问题
- Android内存溢出整理总结 OOM(Out Of Memory) 加载的图片太多或图片过大时经常出现OOM问题
- 关于Python 3.x中,使用print函数时出现的语法错误(SyntaxError: invalid syntax)的问题的原因
- [Android初级]关于使用universal-image-loader加载imagelist出现图片闪烁的问题
- 关于upload_max_filesize设置一直是2M,导致dede图片集上传图片出现upload error错误的问题
- 关于 LF will be replaced by CRLF 问题出现的原因以及解决方式
- 关于jar生成exe时出现背景图片无法显示的问题
- 安卓开发关于图片上传后出现旋转的问题
- 关于微信分享不出去有可能的原因--图片过大
- 关于ORACLE出现ORA-00904标识符错误的问题原因