Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: indepth от Август 28, 2014, 16:47



Название: Не получается нарисовать линию в один пиксель
Отправлено: indepth от Август 28, 2014, 16:47
Не получается нарисовать линию в один пиксель


пример кода:

QPen netPen;

 netPen.setWidth(0);  // пробовал также  netPen.setWidth(1);  netPen.setWidthF(0.1);
 netPen.setColor(netColor);

 painter.setBrush(netColor);
 painter.setPen(netPen);
......
  painter.drawLine(x1,y1,x2,y1)

в результате рисует довольно толстую линию, толщиной явно больше, чем один пиксель.

если делать  netPen.setWidth(2)  то линия получается потолще, а вот тоньше получить не удается.

(http://fitoland.ru/thumbs/922e9975b52a8a0edb557f5a58559c49.jpg) (http://fitoland.ru/images/922e9975b52a8a0edb557f5a58559c49.jpg)

три горизонтальные линии это те, которые не получается сделать тонкими.


Название: Re: Не получается нарисовать линию в один пиксель
Отправлено: Bepec от Август 28, 2014, 17:31
Код:
painter.setBrush(netColor);

Приводите весь код.


Название: Re: Не получается нарисовать линию в один пиксель
Отправлено: GreatSnake от Август 28, 2014, 17:33
Код
C++ (Qt)
QPen::setCosmetic ( bool cosmetic )
И не использовать сглаживание при угле кратным 90.


Название: Re: Не получается нарисовать линию в один пиксель
Отправлено: indepth от Август 29, 2014, 08:53
вот весь код метода

Код:
void TmychartWidget::DrawNet(void)
{
    int x1,y1,x2;

    QPen netPen;
    QRect textRect;
    netPen.setWidth(0);

    painter.setRenderHint(QPainter::SmoothPixmapTransform);  // без этой строки тоже линия толстая
    netPen.setColor(netColor);

    //эти 4 настройки добавил позже, без них также линия толстая
      netPen.setCosmetic(true); // пробовал также false
      netPen.setCapStyle(Qt::FlatCap);
      netPen.setJoinStyle(Qt::MPenJoinStyle);
      netPen.setMiterLimit(0);
    //--------

    painter.setBrush(netColor);
    painter.setPen(netPen);



     x1 =  GetXcoord(xBarOffset*0.9);
     x2 =  GetXcoord(AxisXmax);
     y1 =  GetYcoord(2.5);
     painter.drawLine(x1,y1,x2,y1);

     textRect.setBottom(y1);
     textRect.setLeft(x1-25);
     textRect.setRight(x1-5);
     textRect.setTop(y1-15);
     painter.setFont(QFont("Arial",8));
     painter.drawText(textRect,"2.5");

     y1 =  GetYcoord(5);
     painter.drawLine(x1,y1,x2,y1);

     textRect.setBottom(y1);
     textRect.setLeft(x1-25);
     textRect.setRight(x1-5);
     textRect.setTop(y1-15);
     painter.setFont(QFont("Arial",8));
     painter.drawText(textRect,"5");



     y1 =  GetYcoord(7.5);
     painter.drawLine(x1,y1,x2,y1);

     textRect.setBottom(y1);
     textRect.setLeft(x1-25);
     textRect.setRight(x1-5);
     textRect.setTop(y1-15);
     painter.setFont(QFont("Arial",8));
     painter.drawText(textRect,"7.5");

     painter.setRenderHint(QPainter::Antialiasing);


}


Название: Re: Не получается нарисовать линию в один пиксель
Отправлено: GreatSnake от Август 29, 2014, 10:14
Код
C++ (Qt)
painter.setRenderHint(QPainter::SmoothPixmapTransform);  // без этой строки тоже линия толстая
Ну а это-то здесь зачем ???

Код
C++ (Qt)
bool is_aa_used = painter.renderHints().testFlag( QPainter::Antialiasing );
if( is_aa_used )
painter.setRenderHint( QPainter::Antialiasing, false );
...
if( is_aa_used )
painter.setRenderHint( QPainter::Antialiasing, true );
 


Название: Re: Не получается нарисовать линию в один пиксель
Отправлено: indepth от Август 29, 2014, 10:23
о теперь работает, благодарю !


Название: Re: Не получается нарисовать линию в один пиксель
Отправлено: GreatSnake от Август 29, 2014, 10:31
А нужно ли вообще здесь включать полное сглаживание?
Ведь оно далеко не бесплатное и судя по картинке не нужное вообще.