Pergunta

Estou subclassendo qProgressBar em um widget personalizado e substituo o Paintevente Método com o seguinte 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();

}

Estou tentando exibir uma linha vermelha, como ponto de partida, para ver que posso adicionar minhas próprias modificações ao widget. No entanto, isso não está funcionando. Eu só vejo o widget como um qProgressBar regular. Alguma ideia sobre o que poderia estar errado ?

Foi útil?

Solução

O sistema de coordenadas que você precisa usar é em relação à parte superior esquerda do widget, mas você aparentemente está usando um em relação ao pai do widget. (Os coordenados X e Y do widget são relativos aos pais). Portanto, sua linha estará sendo cortada.

Além disso, é desnecessário chamar QPainter :: BEGIN e QPainter :: Term quando você o constrói usando um parâmetro QWidget *. E o pintor em seu código também não é excluído. Não é necessário criar um pintor na pilha com new: Eu apenas criaria na pilha.

Tentar:

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

}

Isso deve desenhar uma linha horizontal vermelha de 100 pixels de comprimento, começando a partir do meio esquerdo do widget.

Outras dicas

Apenas alguns comentários sobre o que você escreveu:

  1. A maneira como você construiu o pintor QPainter(this) significa que você não precisa ligar explicitamente begin() e end(), Qt cuida disso para você.
  2. Com isso em mente, o destruidor nunca é chamado, isso vazará um monte de memória devido a todos os novos QPainters.
  3. Eu tenho certeza this->x() e this->y() Retorne o canto superior esquerdo da janela, mas você ainda deve ver uma linha vermelha, 5 pixels de largura, na parte superior da janela.

Quando você define o QPainters pincel, tente usar o QBrush construtor explicitamente, como empainter->setBrush( QBrush(Qt::red) );

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top