2017-01-12 1 views
1

J'ai créé un widget ballon pour mon application. Le problème est que la pointe du widget est en dents de scie, alors qu'est-ce que je fais mal?Qt ballon widget widget

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); 
} 

Répondre

0

J'ai trouvé la raison de l'irrégularité. Et je me suis trompé avec ma supposition que je dois masquer le polygone. Si vous utilisez un antialiasing et que vous voulez seulement un stylo 1px (stylo cosmétique), les coordonnées des sommets doivent être 'décalées' de 0.5px. La largeur/hauteur doit être inégale. J'ai donc soustrait 0,5 de ma largeur et de ma taille. Maintenant c'est parfaitement lisse

0

Il me semble que le crénelage est pas causée par l'indice de anticrénelage ne fonctionne pas, mais le masque:

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

masques sont 1 bit transparents/non -transparent. Il n'y a aucun moyen de contourner ce problème.

MAIS

Puisque vous dessinez le polygone vous-même, il semble y avoir aucune raison d'utiliser un masque aussi bien.

Retirez le masque et vérifiez à nouveau "l'irrégularité".

+0

Vous avez raison, la dent n'est pas causée par l'antialiasing mais par défaut QWidget a une forme rectangulaire et je dois masquer la zone non couverte par le polygone pour obtenir une forme personnalisée. Sinon, j'ai un rectangle avec un polygone dessiné dedans. – RobRobRob