Tat*_*nho 3 c++ qt for-loop paintevent
我试图在我的小部件上绘制简单的板.
当我试图自动化时,我的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);
}
Run Code Online (Sandbox Code Playgroud)
你的for循环不正确并导致程序崩溃(我确定这不是你的错).它应该写成这样:
for(int i = 0; i < 100; i+=5){
p.drawLine(QPointF(i,0),QPointF(i,max));
}
Run Code Online (Sandbox Code Playgroud)
即分配增量.这样它就可以完成工作并正确完成.
另外,我建议使用drawPixmap()而不是 setPixmap().但是setPixmap()不会导致无限递归,例如下一代码正常工作.
//...
this->setPixmap(QPixmap("G:/2/qt.jpg"));
QLabel::paintEvent(event);
Run Code Online (Sandbox Code Playgroud)
为什么?使用这种方法永远不会产生无限递归(见这里):
如果在一个本身可以从paintEvent()调用的函数中调用repaint(),则可能会得到无限递归.update()函数永远不会导致递归.
确实是setPixmap()打电话update(),不是repaint().要证明看到源代码:
void QLabel::setPixmap(const QPixmap &pixmap)
{
Q_D(QLabel);
//...
d->updateLabel();//what it does?
}
Run Code Online (Sandbox Code Playgroud)
void QLabelPrivate::updateLabel()
{
Q_Q(QLabel);
//...
q->updateGeometry();
q->update(q->contentsRect());//not repaint
}
Run Code Online (Sandbox Code Playgroud)
正如我所说,这不是一个错误,但我认为如果你能做所有你需要的东西会更好QPainter.
| 归档时间: |
|
| 查看次数: |
952 次 |
| 最近记录: |