2017-01-12 1 views
1

私のアプリケーション用のバルーンウィジェットを作成しました。問題は、ウィジェットの先端がギザギザになっているので、何が間違っているのですか?Qtバルーンウィジェットマスク

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

私はギザギザの理由を発見しました。そして私は、私がポリゴンをマスクする必要があるという私の誤った発言に間違っていました。あなたはアンチエイリアスを使用してのみ1ピクセルをしたい場合(化粧ペン)ペンの頂点座標は0.5pxによって「シフト」する必要があり、幅/高さが不均一でなければなりません。だから私は幅と高さから0.5を差し引いた。

0

それはギザギザがが機能していないアンチエイリアスのヒントによってを生じないように私には見えますが、マスク:

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

マスクされている1ビット透明/非-トランスペアレント。回避策はありません。

しかし

あなたはポリゴンを自分で描いているので、同様にマスクを使用する理由はないように思えます。

マスクを取り外し、再度「ギザギザ」を確認します。

+0

あなたは右のギザギザがアンチエイリアスではなく、長方形の形状を有するQWidgetのデフォルトによって引き起こされていないで、私はカスタムシェイプを取得するためにポリゴンによってカバーされていない領域をマスクする必要が今では完全に滑らかです。それ以外の場合は、ポリゴンを描画した矩形があります。 – RobRobRob