我试着在我的小部件上画一个简单的板。
当我试图将其自动化时,我的paintEvent就会崩溃。我想它是由内部循环引起的,对吗?怎么用另一种方式画呢?
void Widget::paintEvent(QPaintEvent *event)
{
QPixmap myPix( QSize(20,20) );
QPainter painter(this);
for(int i = 0; i < 100; i+5){
painter.drawLine(QPointF(i,0),QPointF(i,max));
}
this->setPixmap(myPix);
}发布于 2014-11-19 12:01:25
您的for循环不正确,并导致程序崩溃(我肯定这不是您的错)。它应该写成这样:
for(int i = 0; i < 100; i+=5){
p.drawLine(QPointF(i,0),QPointF(i,max));
}也就是说,有增量的赋值。这样,它就能做好这项工作,并适当地完成工作。
另外,我建议使用drawPixmap()而不是setPixmap()。但是setPixmap()不会导致无限递归,例如,下一段代码可以正常工作。
//...
this->setPixmap(QPixmap("G:/2/qt.jpg"));
QLabel::paintEvent(event);为什么?使用这种方法,永远不会产生无限递归(请参阅这里):
如果在可能从paintEvent()调用的函数中调用called (),则可能会得到无限递归。update()函数从不导致递归。
实际上,setPixmap()调用的是update(),而不是repaint()。要证明这一点,请参阅源代码:
void QLabel::setPixmap(const QPixmap &pixmap)
{
Q_D(QLabel);
//...
d->updateLabel();//what it does?
}void QLabelPrivate::updateLabel()
{
Q_Q(QLabel);
//...
q->updateGeometry();
q->update(q->contentsRect());//not repaint
}正如我所说的,这不是一个错误,但我认为如果您使用QPainter做所有您需要的事情,情况会更好。
https://stackoverflow.com/questions/27015833
复制相似问题