我在QThread中渲染QPixmap。要绘制的代码在函数内部。如果我在drawChart函数中声明画家一切似乎都没问题,但是如果我在run函数中声明画家,那么在黑白区域的边缘处,图像是错误的,界面处的像素是重叠的,灰色。有谁知道为什么会这样?可能是因为run函数本身的性质?
//This is ok
void RenderThread::run()
{
QImage image(resultSize, QImage::Format_RGB32);
drawChart(&image);
emit renderedImage(image, scaleFactor);
}
drawChart(&image)
{
QPainter painter(image);
painter.doStuff()(;
...
}
//This gives a image that seems to have artifacts
void RenderThread::run()
{
QImage image(resultSize, QImage::Format_RGB32);
QPainter painter(image);
drawChart(painter);
emit renderedImage(image, scaleFactor);
}
drawChart(&painter)
{
painter.doStuff();
...
}
//坏
。
//好
答案 0 :(得分:3)
来自Jasmin Blanchette和Mark Summerfield的Qt 4的C ++ GUI编程:
要理解的一件重要事情是 像素的中心位于 “半像素”坐标。例如, 左上角的像素覆盖了该区域 在点(0,0)和(1,1)之间,和 它的中心位于(0.5,0.5)。 如果我们要求QPainter绘制一个像素, 比如,(100,100),它将近似 通过移动坐标的结果 结果是两个方向都+0.5 在以(100.5, 100.5)被抽出。
这种区别似乎相当 学术起初,但它有 实践中的重要后果。 首先,仅移动+0.5 如果禁用抗锯齿,则会发生 (默认);如果抗锯齿是 启用后,我们尝试绘制一个像素 (100,100)黑色,QPainter会 实际上是四个像素的颜色(99.5, 99.5),(99.5,100.5),(100.5,99.5)和(100.5,100.5)浅灰色,给出 像素躺着的印象 正是在会面点 四个像素。如果这种效果是 不可取的,我们可以避免它 指定半像素坐标 例如,(100.5,100.5)。