Russian Qt Forum
Май 06, 2024, 14:00 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Не получается нарисовать линию в один пиксель  (Прочитано 5176 раз)
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)  то линия получается потолще, а вот тоньше получить не удается.



три горизонтальные линии это те, которые не получается сделать тонкими.
Записан
Bepec
Гость
« Ответ #1 : Август 28, 2014, 17:31 »

Код:
painter.setBrush(netColor);

Приводите весь код.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #2 : Август 28, 2014, 17:33 »

Код
C++ (Qt)
QPen::setCosmetic ( bool cosmetic )
И не использовать сглаживание при угле кратным 90.
Записан

Qt 5.11/4.8.7 (X11/Win)
indepth
Гость
« Ответ #3 : Август 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);


}
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #4 : Август 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 );
 
Записан

Qt 5.11/4.8.7 (X11/Win)
indepth
Гость
« Ответ #5 : Август 29, 2014, 10:23 »

о теперь работает, благодарю !
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #6 : Август 29, 2014, 10:31 »

А нужно ли вообще здесь включать полное сглаживание?
Ведь оно далеко не бесплатное и судя по картинке не нужное вообще.
Записан

Qt 5.11/4.8.7 (X11/Win)
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.099 секунд. Запросов: 23.