Question

Je sous-classe QProgressBar dans un widget personnalisé et j'ai remplacé la méthode paintEvent par le code suivant:


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

}

J'essaie d'afficher une ligne rouge, comme point de départ, pour pouvoir ajouter mes propres modifications au widget. Cependant, cela ne fonctionne pas. Je ne vois le widget que comme un QProgressBar normal. Des idées sur ce qui pourrait mal se passer?

Était-ce utile?

La solution

Le système de coordonnées à utiliser est relatif au coin supérieur gauche du widget, mais vous en utilisez apparemment un par rapport au parent du widget. (Les coordonnées x et y du widget sont relatives à leur parent). Ainsi, votre ligne sera coupée.

De plus, il n'est pas nécessaire d'appeler QPainter :: begin et QPainter :: end lorsque vous le construisez à l'aide d'un paramètre QWidget *. Et le peintre de votre code ne sera pas supprimé non plus. Il n'est pas nécessaire de créer un peintre sur le tas avec nouveau : je le créerais simplement sur la pile.

Essayez:

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

}

Ceci devrait tracer une ligne horizontale rouge de 100 pixels de long en partant du centre-gauche du widget.

Autres conseils

Quelques commentaires sur ce que vous avez écrit:

  1. La façon dont vous avez construit le peintre QPainter (this) signifie que vous n'avez pas besoin d'appeler explicitement begin () et end () . , QT s’occupe de cela pour vous.
  2. En gardant cela à l'esprit, le destructeur n'est jamais appelé, cela perdra beaucoup de mémoire en raison de tous les nouveaux QPainter .
  3. Je suis presque sûr que this- > x () et this- > y () renverront le coin supérieur gauche de la fenêtre, mais vous devriez tout de même voyez une ligne rouge de 5 pixels de large en haut de la fenêtre.

Lorsque vous définissez le pinceau QPainter , essayez d'utiliser le constructeur QBrush explicitement, comme dans painter- > setBrush (QBrush (Qt :: red));

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top