qt4:在单个QGraphicsItem上调用update()导致对所有QGraphicsItem的paint()

时间:2019-06-26 07:44:01

标签: c++ qt qt4 qgraphicsitem

摘要

我在SUSE 64位下使用qt 4.8.7

我有2个具有不同刷新率的QGraphicsItem。但是,当我在其中一个上调用“ update()”时,在两个上都调用了“ paint()”。因此,两个项目的实际刷新率是两次刷新的最高公因数。

我想独立调用paint()方法... 我不知道此问题来自何处以及如何解决(我试图调用QGraphicsItem :: update(QRectF(// item_dimensions //))”而不是QGraphicsItem :: update(),但问题是相同的)

简化代码

toto.hpp

class Toto : public QObject, QGraphicsItem
{

    Q_OBJECT

    public:
    Toto(QString name)
    {
        m_name = name;
    }

    void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget* = NULL)
    {
        QTextStream(stdout) << "paint : " << m_name << endl;
        //other stuff
    }

    public slots:
    void updateSlot()
    {
        QTextStream(stdout) << "\nupdate : " << m_name << endl;
        QGraphicsItem::update();
    }


    private:
    QString m_name;
}

main.cpp

Toto1 = new Toto("toto_1");
Toto2 = new Toto("toto_2");

QTimer *timer1 = new QTimer(500);
QTimer *timer2 = new QTimer(2000);

connect(timer1, SIGNAL(timeout()), toto1, SLOT(updateSlot()));
connect(timer2, SIGNAL(timeout()), toto2, SLOT(updateSlot()));

timer1->start();
timer2->start();

预期输出:

toto_1 update
toto_1 paint

toto_1 update
toto_1 paint

toto_1 update
toto_1 paint

toto_1 update
toto_1 paint

toto_2 update
toto_2 paint
  
    

toto_1每500毫秒更新一次,toto_2每2000毫秒更新一次

  

我得到的东西:

toto_1 update
toto_1 paint
toto_2 paint

toto_1 update
toto_1 paint
toto_2 paint

toto_1 update
toto_1 paint
toto_2 paint

toto_1 update
toto_1 paint
toto_2 paint

toto_2 update
toto_1 paint
toto_2 paint
  
    

toto_1和toto_2均每500毫秒更新一次

  

谢谢您的帮助!

2 个答案:

答案 0 :(得分:2)

我不确定这是否是问题,因为我没有所有信息,但是您可能是QGraphicsItem :: update()方法中记录的副作用的受害者,即:

  

作为重新粉刷物品的副作用,与区域 rect 重叠的其他物品也可能被粉刷。

这是Qt4文档中有关QGraphicsItem :: update()的引文,您可以自己检查here

答案 1 :(得分:0)

我找到了解决方案! 我只是简单地添加了“ setCacheMode(QGraphicsItem :: DeviceCoordinateCache);”,默认值曾经是“ QGraphicsItem :: NoCache”