2

我有两个问题。

  1. paint()API的 ofQGraphicsItempaintEvent()of API 有什么区别QWidget

  2. 我正在开发一个有点像 GUI 的计时器,所以我每 100 毫秒使用paint()嵌入式 linux 板上的 API 更新一次屏幕。它几乎消耗了所有的CPU。知道如何防止这种情况吗?

或者有没有其他方法来做这个简单的图形?

  1. 此外,我在网格布局中有多个QGraphicsScene每个都有自己的。QGraphicsView如何从 MainWindow 更新单个视图。

以下是我目前如何执行此操作的代码:

/****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

4

1 回答 1

2
  1. paintEvent()是一个通用事件处理程序,由 Qt 调用以绘制一个小部件,通常是整个小部件,但有时可以通过尊重 QPaintEvent 的 region 和 rect 属性来优化。
  2. paint()在绘制 QGraphicsScene 时,由 QGraphicsView 在各个 QGraphicsItems 上调用。通常不会在所有项目上调用它,QGraphicsView 在绘制项目之前会进行各种检查,例如确保项目在视口中并且没有被其他项目隐藏等。

从您发布的代码中,我看到了两个优化:首先,不要为每个项目单独运行 QTimer,而是为整个场景运行一个计时器。现在,您的代码每 100 毫秒最多触发 N 次重绘,而不是一次。此外,更新项目的属性并让他们在属性实际更改时自行调用QGraphicsItem::update() ,而不是无条件地更新整个场景。

于 2015-05-25T07:22:44.350 回答