qt problème pour passer outre paintEvent
-
22-07-2019 - |
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?
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:
- La façon dont vous avez construit le peintre
QPainter (this)
signifie que vous n'avez pas besoin d'appeler explicitementbegin ()
etend ()
. , QT s’occupe de cela pour vous. - En gardant cela à l'esprit, le destructeur n'est jamais appelé, cela perdra beaucoup de mémoire en raison de tous les nouveaux
QPainter
. - Je suis presque sûr que
this- > x ()
etthis- > 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));