2017-01-12 3 views
1

Я создал виджет воздушного шара для своего приложения. Проблема в том, что кончик виджета зазубрен, поэтому что я делаю неправильно?Qt ballget widget mask

Jagged tip

void BalloonWidget::paintEvent(QPaintEvent *) 
{ 
    QVector<QPointF> vertices; 
    vertices << QPointF(0, 0) 
      << QPointF(width(), 0) 
      << QPointF(width(), height() * 0.8) 
      << QPointF(width() * 0.60, height() * 0.8) 
      << QPointF(width() * 0.5, height()) 
      << QPointF(width() * 0.40, height() * 0.8) 
      << QPointF(0, height() * 0.8); 

    balloonPoly = QPolygonF(vertices); 

    QPainter painter(this); 
    painter.setRenderHint(QPainter::Antialiasing, true); 
    painter.setRenderHint(QPainter::HighQualityAntialiasing, true); 
    painter.setBrush(QBrush(backgroundColor)); 

    QRegion maskRegion(balloonPoly.toPolygon(), Qt::WindingFill); 
    painter.drawPolygon(balloonPoly); 
    setMask(maskRegion); 
} 

ответ

0

Я нашел причину неровности. И я ошибся с моим предположением, что мне нужно замаскировать многоугольник. Если вы используете сглаживание и хотите только 1px (косметическая ручка), координаты вершин должны быть «сдвинуты» на 0,5px. Ширина/высота должны быть неравномерными. Поэтому я вычитал 0,5 из моей ширины и высоты. Теперь это совершенно гладко

0

Он смотрит на меня, что зазубренность является не вызвала по антиалайзинговому намеку не работает, но маска:

QRegion maskRegion(balloonPoly.toPolygon(), Qt::WindingFill); 
painter.drawPolygon(balloonPoly); 
setMask(maskRegion); 

Маска 1 битых прозрачной/не -transparent. Невозможно обойти это.

НО

Поскольку вы рисуете многоугольник себя, кажется, нет никаких причин, чтобы использовать маску, а также.

Снимите маску и снова проверьте «зубчатость».

+0

Вы правы, зубчатость не вызывает сглаживание, но по умолчанию QWidget имеет прямоугольную форму, и я должен замаскировать область, не покрытую многоугольником, чтобы получить пользовательскую форму. В противном случае у меня есть прямоугольник с нарисованным в нем многоугольником. – RobRobRob