Qt中的paint()与paintEvent()
我有两个问题Qt中的paint()与paintEvent(),qt,paint,qgraphicsitem,paintevent,Qt,Paint,Qgraphicsitem,Paintevent,我有两个问题 QGraphicsItem的paint()和QWidgetapi的paintEvent()之间有什么区别 我正在开发一个类似计时器的GUI,所以我在嵌入式linux板上每隔100毫秒用paint()API更新一次屏幕。它几乎消耗了所有的CPU。你知道怎么预防吗 或者有没有其他方法来完成这个简单的图形 我还有多个qgraphicscene,每个都在网格布局中有自己的QGraphicsView。如何从主窗口更新单个视图 下面是我目前如何执行此操作的代码: /****SCENE 1***
QGraphicsItem
的paint()
和QWidget
api的paintEvent()
之间有什么区别paint()
API更新一次屏幕。它几乎消耗了所有的CPU。你知道怎么预防吗qgraphicscene
,每个都在网格布局中有自己的QGraphicsView
。如何从主窗口更新单个视图/****SCENE 1*****/
scene_1 = new QGraphicsScene();
scene_1->setBackgroundBrush(Qt::black);
ui->gv_1->setScene(scene_1);
ui->gv_1->setRenderHint(QPainter::Antialiasing);
circle = scene_1->addEllipse(50, 80, 150, 150, outlinePen, darkGreyBrush);
textSlotNo = scene_1->addText("1", QFont("Arial", 30) );
textSlotNo->setDefaultTextColor(Qt::gray);
textSlotNo->setPos(0,50);
MyItem *item_1 = new MyItem(1);
scene_1->addItem(item_1);
item_1->timer = new QTimer();
connect(item_1->timer, SIGNAL(timeout()),scene_1, SLOT(update()));
item_1->timer->start(100);
/****SCENE 2*****/
......
硬件:TI-AM3354
paintEvent()
是一个通用的事件处理程序,Qt调用它来绘制一个小部件,通常是整个小部件,但有时可以根据QPaintEvent的区域和rect属性进行优化paint()
。通常不会对所有项目调用它,QGraphicsView会在绘制项目之前进行各种检查,例如确保项目位于视口中,而不会被其他项目隐藏,等等从您发布的代码中,我看到了两个优化:首先,不要为每个项目单独运行一个QTimer,而是为整个场景运行一个计时器。现在,您的代码每100毫秒触发多达N次重绘,而不是一次。另外,更新项目的属性,如果属性实际发生更改,则允许他们调用自己,而不是无条件地更新整个场景。还添加每100ms更新项目的代码。每个项目都有一个计时器肯定是没有效率的,而且即使没有任何变化,看起来你也要重新绘制所有内容。如果项目的属性发生更改,请尝试简单地更新项目,并且根本不手动调用update()。我会每100毫秒更新一次场景。我画了一个不同起始位置的弧,从而使它看起来像是在旋转。我还在场景中使用drawText()更新时间。有没有其他方法不在每个场景上使用QTimer?我只使用了一个计时器,CPU就被这一个计时器完全占用了。你有多少个场景?我有10个场景要更新。现在只需要测试一个。当项目实际更改时调用QGraphicsItem::update(),然后我才更改项目的视觉效果,即现在每隔1分钟在
QTimer
的插槽上调用update()
。对于单计时器的想法,我应该为每个项目注册一个事件并在timerEvent()中使用它吗?再次感谢您的帮助:)我正在一个单独的插槽中更新每个视图,就像这样connect(item_1->timer,SIGNAL(timeout()),this,slot(updateUI_1())代码>和内部updateUI\u 1()
I callscene\u 1->update()
您能告诉我这是正确的方法吗?您根本不应该在场景中调用update(),只要更新项目属性,如果属性发生了实际更改,就让它们在内部调用update()