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()
    之间有什么区别

  • 我正在开发一个类似计时器的GUI,所以我在嵌入式linux板上每隔100毫秒用
    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属性进行优化
  • 绘制QGraphicsCenter时,QGraphicsView在各个QGraphicsSitem上调用
    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 call
    scene\u 1->update()
    您能告诉我这是正确的方法吗?您根本不应该在场景中调用update(),只要更新项目属性,如果属性发生了实际更改,就让它们在内部调用update()