qt - Qt 中的 Paint() 与 PaintEvent()

标签 qt paint qgraphicsitem paintevent

我有两个问题。

  1. QGraphicsItempaint()QWidgetpaintEvent()有什么区别蜜蜂?

  2. 我正在开发一个类似于 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

    最佳答案

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

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

    关于qt - Qt 中的 Paint() 与 PaintEvent(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30432013/

    相关文章:

    c++ - C++/Qt 项目中用于外部库的 CMake

    java - 传递绘制的图形

    c++ - 使用自定义项目类的 QGraphicsScene::removeItem() 后崩溃

    qt - 在槽函数运行时显示一个 "Please wait..."框

    c++ - Qt5 静态链接在 Ubuntu Linux 上失败

    java - 如何在小程序上绘制图像

    android - 具有自定义粗细的虚线分隔符

    qt - 子类化 QGraphicsView 并设置 drawBackground

    c++ - 绘制 QGraphicsItem 的边框

    c++ - QFileSystemWatcher Unresolved external