通过QTimer给QGraphicsItem加一个闪动功能

如果给继承自QGraphicsItem的类加一个闪动功能,比如闪动的图标、背景等等,通过QTimer来完成的理念很简单,只需在timer发出 timeout信号时,再让这个timer启动,然后反复闪动就可以。我们可以考虑给继承自QGraphicsItem的类加上如下的两个函数,一个控制闪动的开始和结束,一个用来变换闪动的颜色。

void QGraphicsCustomizedItem::setFlash(bool _enabled){ //通过这个函数来控制闪动的起始和结束
    if(_enabled){
        timer.start(flashFreq);
    }
    else{
        timer.stop();
        setFrameColor(QColor(255,0,0));//默认设置成红色
    }
}

void QGraphicsCustomizedItem::doFlash(){//每次timeout时,设置红绿变色
    if(frame.brush().color() == QColor(255,80,80)){
        setFrameColor(QColor(0,255,0));
    }
    else{
        setFrameColor(QColor(255,0,80));  
    }
}

剩下的,我们需要的仅仅是把timer的timeout信号和doFlash结合起来,但是QGrahpicsItem并非继承自QObject,不能够直接通过connect把timeout和doFlash连起来。但是我们可以编写下面的辅助类FlashObject,来完成此工作:
class QGraphicsCustomizedItem;
class FlashObject : public QObject{
    Q_OBJECT
  
private:
        QGraphicsCustomizedItem* item;
public:
        FlashObject(QGraphicsCustomizedItem* _i){item = _i;}
public slots:
        void flash();
};

void FlashObject::flash(){
    item->doFlash();
}

这样的话,可以在QGraphicsCustomizedItem类对象内增加一个FlashObject的对象,可以直接把timeout信号和flash槽结合起来,完成QGraphicsCustomizedItem对象的闪动。


 
根据引用内容,可以使用Qt和Box2D结合QGraphicsItem来实现物体的自由落体效果。下面是一个示例代码: ```cpp #include <QApplication> #include <QGraphicsScene> #include <QGraphicsView> #include <QTimer> #include <Box2D/Box2D.h> class MyContactListener : public b2ContactListener { void BeginContact(b2Contact* contact) { // 处理碰撞开始事件 } void EndContact(b2Contact* contact) { // 处理碰撞结束事件 } }; int main(int argc, char *argv[]) { QApplication a(argc, argv); // 创建场景和视图 QGraphicsScene scene; QGraphicsView view(&scene); view.setRenderHint(QPainter::Antialiasing); view.setSceneRect(-200, -200, 400, 400); view.show(); // 创建物理世界 b2Vec2 gravity(0.0f, 9.8f); b2World world(gravity); MyContactListener contactListener; world.SetContactListener(&contactListener); // 创建地面 b2BodyDef groundBodyDef; groundBodyDef.position.Set(0.0f, 200.0f); b2Body* groundBody = world.CreateBody(&groundBodyDef); b2PolygonShape groundBox; groundBox.SetAsBox(200.0f, 10.0f); groundBody->CreateFixture(&groundBox, 0.0f); // 创建物体 b2BodyDef bodyDef; bodyDef.type = b2_dynamicBody; bodyDef.position.Set(0.0f, -100.0f); b2Body* body = world.CreateBody(&bodyDef); b2CircleShape dynamicCircle; dynamicCircle.m_radius = 10.0f; b2FixtureDef fixtureDef; fixtureDef.shape = &dynamicCircle; fixtureDef.density = 1.0f; fixtureDef.friction = 0.3f; body->CreateFixture(&fixtureDef); // 创建定时器,模拟物理世界 QTimer timer; QObject::connect(&timer, &QTimer::timeout, [&]() { world.Step(1.0f / 60.0f, 6, 2); b2Vec2 position = body->GetPosition(); qreal x = position.x * 10.0; qreal y = -position.y * 10.0; body->SetTransform(b2Vec2(x, y), 0.0f); body->SetLinearVelocity(b2Vec2(0.0f, 0.0f)); body->SetAngularVelocity(0.0f); scene.clear(); scene.addEllipse(x - 10, y - 10, 20, 20); }); timer.start(16); return a.exec(); } ``` 这段代码使用了Qt的QGraphicsScene和QGraphicsView来显示物体的自由落体效果。通过Box2D物理引擎模拟物体的运动,并在每次模拟后更新物体在场景中的位置。在这个例子中,物体是一个圆形,它会从初始位置自由落体,并在与地面碰撞后反弹。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

socratescli

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值