我试图在我的小部件上绘制简单的板子。

当我尝试自动执行此操作时,paintEvent崩溃。我认为这是由内部的for循环引起的,对吗?如何用其他方式绘画?

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

最佳答案

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

为什么?使用这种方法,永远不会产生无限递归(请参阅here):



实际上setPixmap()调用update(),而不是repaint()。为了证明这一点,请参见源代码:

setPixmap source:
void QLabel::setPixmap(const QPixmap &pixmap)
{
    Q_D(QLabel);
    //...
    d->updateLabel();//what it does?
}

updateLabel source:
void QLabelPrivate::updateLabel()
{
    Q_Q(QLabel);
    //...
    q->updateGeometry();
    q->update(q->contentsRect());//not repaint

}

就像我说的那样,这不是一个错误,但是我认为,如果您使用QPainter来完成所有需要的工作,那会更好。

关于c++ - Qt paintEvent崩溃,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27015833/

10-10 09:48