QT开发中文网

定时器创建graphicsitem?

在使用Qt进行图形界面开发时,可以通过定时器创建Graphics Item。下面是一个简单的示例代码,演示了如何使用定时器创建一个可移动的矩形项(RectItem):

#include <QGraphicsItem>
#include <QTimer>

class RectItem : public QGraphicsItem
{
public:
    RectItem() : rect(0, 0, 100, 100), speed(2)
    {
        // 创建定时器,并连接到更新函数
        timer = new QTimer(this);
        connect(timer, &QTimer::timeout, this, &RectItem::updatePosition);
        
        // 启动定时器
        timer->start(16); // 每隔16毫秒触发一次
        
        setFlag(ItemIsMovable);
    }
    
    QRectF boundingRect() const override
    {
        return rect;
    }
    
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override
    {
        painter->setBrush(Qt::red);
        painter->drawRect(rect);
    }
    
private slots:
    void updatePosition()
    {
        rect.moveLeft(rect.left() + speed);
        
        if (rect.left() > scene()->sceneRect().right()) {
            rect.moveLeft(scene()->sceneRect().left());
        }
        
        update(); // 刷新图形项
    }
    
private:
    QRectF rect;
    int speed;
    QTimer* timer;
};

上述代码中,我们创建了一个名为RectItem的自定义图形项类。在构造函数中,我们创建了一个定时器,并将其与更新函数updatePosition()连接。然后启动定时器,使其每隔一段时间触发一次。

boundingRect()函数中,我们定义了图形项的边界矩形。在paint()函数中,我们使用红色画刷绘制矩形项。

updatePosition()槽函数中,我们更新矩形项的位置,并检查是否超出了场景的边界。如果超出了右边界,则将其移动到左边界,并通过调用update()来刷新图形项。

要将这个图形项添加到场景中显示,你需要创建一个QGraphicsScene对象并将该图形项添加到其中。

#include <QGraphicsScene>
#include <QGraphicsView>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    
    QGraphicsScene scene;
    
    RectItem* rectItem = new RectItem();
    scene.addItem(rectItem);
    
    QGraphicsView view(&scene);
    view.show();
    
    return app.exec();
}

上述代码创建了一个QGraphicsScene对象和一个关联的视图QGraphicsView,并将之前创建的矩形项添加到场景中。最后,显示视图并运行应用程序。

这样就可以通过定时器创建可移动的矩形项,并在图形界面中进行展示。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://qt.0voice.com/?id=5817

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?