2016-03-30 14 views
0

Hier sind zwei QWidget schwarz lackiert. Das Gemälde links QWidget wurde unter Verwendung von QPainter (überschreiben ::paintEvent(...)) durchgeführt. Das richtige Widget wurde mit QStyleSheet "gemalt".Qt Antialiasing mit QPainter im Vergleich zu QStyleSheets

enter image description here

Diese Arbeit wurde in PyQt4 (Python: 2.7.11+/Qt: 4.8.7/PyQt4: 4.11.4) durchgeführt. Aber Sie haben das gleiche Ergebnis mit PyQt5 und C++ Qt4/Qt5 erreicht.

Der Code, den ich die linke QWidget zu malen verwendete

def paintEvent(self, pEvent) : 

    painter = QPainter(self) 
    painter.setRenderHints(QPainter.HighQualityAntialiasing) 

    painter.setPen(Qt.black) 
    painter.setBrush(Qt.black) 

    painter.drawRoundedRect(self.rect(), 10.0, 10.0) 

    painter.end() 

    pEvent.accept() 

Das Stylesheet auf der rechten Widget verwendet

setStyleSheet("border-radius: 10px; border: 1px solid black; background: black;") 

ist Warum gezogen den beiden gibt es einen Unterschied zwischen, vor allem die Rundung von QStyleSheet viel glatter als die von QPainter trotz Verwendung QPainter.HighQualityAntialiasing Render-Hinweis getan? Sie könnten nur QPainter.Antialiasing oder QPainter.TextAntialiasing verwenden und trotzdem verbessert sich die Situation nicht.

Antwort

1

Mit einer Farbe zur Initialisierung der QPen wählen Sie einen Stift (und damit eine Grenze) Breite von 0; Ich schätze, dass Sie es wie im Stylesheet auf 1 px setzen sollten, um das gleiche Ergebnis zu erhalten. Versuchen

painter.setPen(QPen(Qt.black, 1)) 

Edit: Ich kam gerade über einigen alten Code von mir, abgerundeten Ränder für QLabel s realisieren. Ich wurde gezwungen, die QRect für die Stiftbreite zu korrigieren, sonst habe ich ähnlich hässliche Ergebnisse. Die Implementierung wird in einem benutzerdefinierten Stil platziert. Die Schattenfarbe wird auf die entsprechende Rahmenfarbe eingestellt:

void MyStyle::drawControlHeaderFrame(const QStyleOptionFrameV3* option, 
    QPainter* painter, const QWidget* widget) const 
{ 
    QPalette::ColorGroup cg = QPalette::Active; 

    if(!(option->state & QStyle::State_Enabled)) 
     cg = QPalette::Disabled; 
    else if(!(option->state & QStyle::State_Active)) 
     cg = QPalette::Inactive; 

    const int lineWidth = 2, frameAdjustment = lineWidth/2; 
    QRect rect(option->rect); 
    //Adjust for pen width 
    rect.adjust(frameAdjustment, frameAdjustment, -frameAdjustment, -frameAdjustment); 

    QPen pen(option->palette.color(cg, QPalette::Shadow)); 
    pen.setWidth(lineWidth); 

    painter->save(); 
    { 
     painter->setRenderHint(QPainter::Antialiasing); 
     painter->setPen(pen); 
     painter->drawRoundedRect(rect, 9, 9); 
    } 
    painter->restore(); 
} 
+0

Nein. Ich denke, dass die Standardbreite 1 ist. Auch hilft das Einstellen mit nichts anderem. Versuchte Breite 0 und 2. Absolut keine Änderung. – Marcus

+0

Tatsächlich gibt sogar dieser Code, den Sie vorschlagen, das gleiche Ergebnis. Hier ist der Screenshot der Implementierung: http://i.imgur.com/ylK0YkH.jpg – Marcus