gpt4 book ai didi

c++ - Qt paintEvent 崩溃

转载 作者:太空狗 更新时间:2023-10-29 20:24:40 25 4
gpt4 key购买 nike

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

当我尝试将其自动化时,我的 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 ):

If you call repaint() in a function which may itself be called from paintEvent(), you may get infinite recursion. The update() function never causes recursion.

确实 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com