首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Qt paintEvent崩溃

Qt paintEvent崩溃
EN

Stack Overflow用户
提问于 2014-11-19 11:33:29
回答 1查看 1.5K关注 0票数 3

我试着在我的小部件上画一个简单的板。

当我试图将其自动化时,我的paintEvent就会崩溃。我想它是由内部循环引起的,对吗?怎么用另一种方式画呢?

代码语言:javascript
复制
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);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-19 12:01:25

您的for循环不正确,并导致程序崩溃(我肯定这不是您的错)。它应该写成这样:

代码语言:javascript
复制
for(int i = 0; i < 100; i+=5){
    p.drawLine(QPointF(i,0),QPointF(i,max));
}

也就是说,有增量的赋值。这样,它就能做好这项工作,并适当地完成工作。

另外,我建议使用drawPixmap()而不是setPixmap()。但是setPixmap()不会导致无限递归,例如,下一段代码可以正常工作。

代码语言:javascript
复制
//...
this->setPixmap(QPixmap("G:/2/qt.jpg"));
QLabel::paintEvent(event);

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

如果在可能从paintEvent()调用的函数中调用called (),则可能会得到无限递归。update()函数从不导致递归。

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

setPixmap来源:

代码语言:javascript
复制
void QLabel::setPixmap(const QPixmap &pixmap)
{
    Q_D(QLabel);
    //...
    d->updateLabel();//what it does?
}

updateLabel来源:

代码语言:javascript
复制
void QLabelPrivate::updateLabel()
{
    Q_Q(QLabel);
    //...
    q->updateGeometry();
    q->update(q->contentsRect());//not repaint

}

正如我所说的,这不是一个错误,但我认为如果您使用QPainter做所有您需要的事情,情况会更好。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27015833

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档