2009-05-08 12 views
1

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


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 Ausgang Punkt, um zu sehen, dass ich meine eigenen Änderungen zum Widget hinzufügen kann. Dies funktioniert jedoch nicht. Ich sehe das Widget nur als reguläre QProgressBar. Irgendwelche Ideen, was könnte falsch sein?

Antwort

7

Das Koordinatensystem Sie verwenden müssen, ist relativ zu der oberen linken Ecke des Widgets, aber Sie‘ Sie verwenden anscheinend einen relativ zum übergeordneten Element des Widgets. (Die x- und y-Koordinaten von Widget sind relativ zu ihren Eltern). So wird Ihre Zeile abgeschnitten.

Außerdem müssen Sie QPainter :: begin und QPainter :: end nicht aufrufen, wenn Sie sie mit einem QWidget * -Parameter erstellen. Und der Maler in Ihrem Code wird auch nicht gelöscht. Es ist nicht notwendig, einen Maler auf dem Haufen mit new zu erstellen: Ich würde es einfach 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); 

} 

Die von dem Start mitte-links des Widgets einer rote horizontale Linie 100 Pixel lang ziehen sollte.

+0

Ist es möglich, ein Debug-Flag von einigen Arten zu setzen, die sagen, wenn etwas auf dem Bildschirm angezeigt wird oder nicht? – Geo

+0

Geo: Ich glaube nicht, dass es ein Debug-Flag gibt. Es gibt einige Dinge, die Sie tun können, wenn Sie befürchten, dass dies in Zukunft ein Problem sein könnte. Sie können versuchen, z.B. Zeichnen Sie eine große rote Box über Ihr Widget von -10000, -10000 bis 10000, 10000 in der Hoffnung, dass Sie etwas sehen, und ändern Sie dann Ihren Code, bis Sie keine Ausgabe mehr sehen können. Sie können auch versuchen, den Clipping-Bereich oder den Clipping-Pfad aus dem QPainter zu erhalten und deren umgrenzende Rechtecke auszudrucken, um zu prüfen, ob die Koordinaten nahe an dem liegen, was Sie denken. – Doug

1

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

  1. Die Art und Weise Sie den Maler konstruiert QPainter(this) heißt, Sie müssen nicht explizit begin() und end() nennen, QT Pflege für Sie das dauert.
  2. In diesem Sinne wird der Destruktor nie aufgerufen, dies wird aufgrund der neuen QPainter s eine Menge Speicher verlieren.
  3. Ich bin ziemlich sicher this->x() und this->y() die obere linke Ecke des Fensters zurück, aber Sie sollten immer noch eine rote Linie sehen, 5 Pixel breit, am oberen Rand des Fensters.

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