【问题标题】:Qt paintEvent crashesQt paintEvent 崩溃
【发布时间】:2014-11-19 11:33:29
【问题描述】:

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

当我尝试自动执行此操作时,我的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);
}

【问题讨论】:

  • 您是在某处定义max,还是不小心将函数的地址传递给了QPointF?
  • 我认为this-&gt;setPixmap(myPix); 会递归调用您的绘画事件。
  • 是的,最大值只是一些浮点值,我在从文本文件加载一些数据时设置它,它只是小部件的最大高度。我用 setPixmap 删除了这一行,但没有帮助(通常我也删除了 myPix 的声明:))
  • @vahancho 我认为我应该不同意你的观点,我在回答中添加了解释为什么paintevent中的setPixmap不会产生无限递归。
  • @Chernobyl,很好,但您的回答似乎无法解释为什么这段代码会崩溃。

标签: c++ qt for-loop paintevent


【解决方案1】:

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

如果你在一个本身可能被调用的函数中调用 repaint() paintEvent(),你可能会得到无限递归。更新()函数 永远不会导致递归。

确实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 做所有你需要做的事情会更好。

【讨论】:

  • 有效!我的天,为什么我自己没有看到这个。还是谢谢!
  • 不知道有没有可能在paintEvent中获取这样一个板子作为widget的背景而不是重绘呢?
  • 你说 我建议使用 drawPixmap() 而不是 setPixmap(),但是在你的代码 sn-p 中你有 this-&gt;setPixmap(..).. 这有点令人困惑。 . 这是一个错误吗?
  • @thuga 如您所见,我的答案已被编辑,您可以看到我之前的(未编辑的)答案(请参阅编辑历史),它没有完美的语法,但很清楚。我没有看到我的答案编辑不正确,所以我编辑了它。主要思想是证明paintEvent中的setPixmap不会导致递归绘制
  • @Tata​​rinho 请看这个:qt-project.org/doc/qt-4.8/qwidget.html#paintEvent 请注意 setPalette。如您所见,您应该使用paintEvent 或setPixmap、setPalette 等方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-03
  • 2018-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
相关资源
最近更新 更多