QPainter, объявленный внутри функции запуска, создает артефакт - PullRequest
0 голосов
/ 27 апреля 2010

Я рендерил QPixmap внутри QThread. код для рисования находится внутри функции. Если я объявляю рисователь внутри функции drawChart, все выглядит нормально, но если я объявляю рисователь внутри функции 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();    
  ...  
}

// * плохой * 1004 Valid XHTML.
// хороший
Valid XHTML.

1 Ответ

3 голосов
/ 28 апреля 2010

Из C ++ Программирование с помощью Qt 4 Жасмин Бланшетт и Марка Саммерфилда:

Одна важная вещь для понимания что центр пикселя лежит на «Полупиксельные» координаты. Например, верхний левый пиксель покрывает область между точками (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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...