Pregunta

Estoy subclasificando QProgressBar en un widget personalizado y sobrescribí el método paintEvent con el siguiente código:


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

}

Estoy tratando de mostrar una línea roja, como punto de partida, para ver que puedo agregar mis propias modificaciones al widget. Sin embargo, esto no está funcionando. Solo veo el widget como un QProgressBar normal. ¿Alguna idea sobre lo que podría estar mal?

¿Fue útil?

Solución

El sistema de coordenadas que necesita usar es relativo a la esquina superior izquierda del widget, pero aparentemente está usando uno relativo al padre del widget. (Las coordenadas x e y del widget son relativas a su padre). Entonces su línea se recortará.

Además, no es necesario llamar a QPainter :: begin y QPainter :: end cuando lo construyes usando un parámetro QWidget *. Y el pintor en su código tampoco se elimina. No es necesario crear un pintor en el montón con new : simplemente lo crearía en la pila.

Prueba:

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

}

Esto debería dibujar una línea horizontal roja de 100 píxeles de largo comenzando desde el centro-izquierda del widget.

Otros consejos

Solo algunos comentarios sobre lo que ha escrito:

  1. La forma en que construyó el pintor QPainter (this) significa que no necesita llamar explícitamente a begin () y end () , QT se encarga de eso por usted.
  2. Con eso en mente, nunca se llama al destructor, esto perderá un montón de memoria debido a todos los nuevos QPainter s.
  3. Estoy bastante seguro de que this- > x () y this- > y () devuelven la esquina superior izquierda de la ventana, pero aún así debería ver una línea roja, de 5 píxeles de ancho, en la parte superior de la ventana.

Cuando configure el pincel QPainter , intente usar el constructor QBrush explícitamente, como en pintor- > setBrush (QBrush (Qt :: red));

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top