Domanda

Sto sottoclassando QProgressBar in un widget personalizzato e ho sovrascritto il metodo paintEvent con il seguente codice:


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

}

Sto provando a visualizzare una linea rossa, come punto di partenza, per vedere che posso aggiungere le mie modifiche al widget. Tuttavia, questo non funziona. Vedo solo il widget come un normale QProgressBar. Qualche idea su cosa potrebbe essere sbagliato?

È stato utile?

Soluzione

Il sistema di coordinate che devi usare è relativo alla parte superiore sinistra del widget, ma apparentemente ne stai usando uno relativo al genitore del widget. (Le coordinate x e y del widget sono relative al loro genitore). Quindi la tua linea verrà tagliata.

Inoltre, non è necessario chiamare QPainter :: begin e QPainter :: end quando lo costruisci usando un parametro QWidget *. E neanche il pittore nel tuo codice viene cancellato. Non è necessario creare un pittore nell'heap con new : lo creerei semplicemente nello stack.

Prova:

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

}

Questo dovrebbe tracciare una linea orizzontale rossa lunga 100 pixel a partire dalla metà sinistra del widget.

Altri suggerimenti

Solo alcuni commenti su ciò che hai scritto:

  1. Il modo in cui hai creato il pittore QPainter (questo) significa che non è necessario chiamare esplicitamente begin () e end () , QT se ne occupa per te.
  2. Tenendo presente ciò, il distruttore non viene mai chiamato, questo perderà un sacco di memoria a causa di tutti i nuovi QPainter .
  3. Sono abbastanza sicuro che this- > x () e this- > y () restituiscono l'angolo in alto a sinistra della finestra, ma dovresti comunque vedi una linea rossa, larga 5 pixel, nella parte superiore della finestra.

Quando imposti il ??pennello QPainter , prova a usare esplicitamente il costruttore QBrush , come in painter- > setBrush (QBrush (Qt :: red));

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top