Frage

Ich bin Subklassen QProgressBar in einem benutzerdefinierten Widget, und ich überschrieb die paintEventO Methode mit dem folgenden Code:


void myProg::paintEvent(QPaintEvent *pe)
{
    QProgressBar::paintEvent(pe);
    QRect region = pe->rect();
    QPainter *painter = new QPainter(this);
    QPen *pen = new QPen;
    painter->begin(this);
    painter->setBrush(Qt::red);
    int x = this->x();
    int y = this->y();
    pen->setWidth(10);
    painter->setPen(*pen);
    painter->drawLine(x,y,x+100,y);
    painter->end();

}

Ich versuche, eine rote Linie angezeigt werden, als Ausgangspunkt, um zu sehen, dass ich meine eigenen Änderungen an den Widget hinzufügen kann. Dies ist jedoch nicht funktioniert. Ich sehe nur das Widget als reguläres QProgressBar. Alle Ideen, was könnte falsch sein?

War es hilfreich?

Lösung

Das System Sie koordinieren müssen, ist relativ verwenden, um die Top-links des Widgets, aber Sie sind offenbar ein in Bezug auf das Widget-Eltern verwenden. (Widget der x und y Koordinaten sind relativ zu ihren Eltern). So wird Ihre Linie abgeschnitten zu werden.

Außerdem ist es nicht notwendig QPainter zu nennen :: beginnen und QPainter :: Ende, wenn Sie es ein QWidget konstruieren mit * Parameter. Und der Maler in Ihrem Code erhält nicht, entweder gelöscht. Es ist nicht notwendig, einen Maler auf dem Heap mit new zu schaffen. Ich würde es nur auf dem Stapel erstellen

Versuchen:

void myProg::paintEvent(QPaintEvent *pe)
{
    QProgressBar::paintEvent(pe);
    QRect region = pe->rect();
    QPainter painter(this);
    QPen pen(Qt::red); //Note: set line colour like this

    //(Brush line removed; not necessary when drawing a line)
    int x = 0; //Note changed
    int y = height() / 2; //Note changed
    pen.setWidth(10);
    painter.setPen(pen);
    painter.drawLine(x,y,x+100,y);

}

Dies sollte eine rote horizontale Linie 100 Pixel lang ausgehend von der Mitte-links des Widgets ziehen.

Andere Tipps

Nur ein paar Kommentare über das, was Sie haben geschrieben:

  1. Die Art und Weise der Maler QPainter(this) konstruiert heißt, Sie müssen nicht explizit begin() und end() nennen, nimmt QT kümmern, dass für Sie.
  2. Mit dem im Verstand, der Destruktor nie aufgerufen wird, wird dies eine Reihe von Speicherverlust aufgrund aller neuen QPainters.
  3. Ich bin mir ziemlich sicher, dass this->x() und this->y() die obere linke Ecke des Fensters zurück, aber man sollte immer noch eine rote Linie, 5 Pixel breit, am oberen Rand des Fensters sehen.

Wenn Sie die QPainters Pinsel-Set, versuchen Sie den QBrush Konstruktor explizit mit, wie in painter->setBrush( QBrush(Qt::red) );

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top