QT Problemas substituindo o pintinho
-
22-07-2019 - |
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 ?
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:
- A maneira como você construiu o pintor
QPainter(this)
significa que você não precisa ligar explicitamentebegin()
eend()
, Qt cuida disso para você. - Com isso em mente, o destruidor nunca é chamado, isso vazará um monte de memória devido a todos os novos
QPainter
s. - Eu tenho certeza
this->x()
ethis->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 QPainter
s pincel, tente usar o QBrush
construtor explicitamente, como empainter->setBrush( QBrush(Qt::red) );