我有两个问题。
QGraphicsItem
的paint()
和QWidget
的paintEvent()
有什么区别蜜蜂?我正在开发一个类似于 GUI 的计时器,因此我在嵌入式 Linux 板上使用
paint()
API 每 100 毫秒更新一次屏幕。它几乎消耗了所有的CPU。知道如何防止这种情况吗?
或者还有其他方法来制作这个简单的图形吗?
- 此外,我还有多个
QGraphicsScene
,每个在网格布局中都有自己的QGraphicsView
。如何从主窗口更新单个 View 。
下面是我目前执行此操作的代码:
/****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 的区域和矩形属性来优化。paint()
在绘制 QGraphicsScene 时由 QGraphicsView 在各个 QGraphicsItems 上调用。它通常不会在所有项目上调用,QGraphicsView 在绘制项目之前会进行各种检查,例如确保该项目位于视口(viewport)中并且不被其他项目隐藏等。
从您发布的代码中,我看到了两个优化:第一,不要为每个项目单独运行 QTimer,而是为整个场景运行一个计时器。现在,您的代码每 100 毫秒触发最多 N 次重绘,而不是一次。另外,更新您的项目的属性并让它们调用 QGraphicsItem::update()如果属性确实发生了变化,则自行,而不是无条件更新整个场景。
关于qt - Qt 中的 Paint() 与 PaintEvent(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30432013/