在运行函数内声明的QPainter会创建工件

时间:2010-04-27 18:22:22

标签: qt

我在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();    
  ...  
}

//坏
Valid XHTML
//好
Valid XHTML

1 个答案:

答案 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)。