QT开发中文网

用Qt绘制水流流动的效果

要实现水流流动的效果,可以使用Qt中的QPainter类和定时器。以下是一个简单的示例:

#include <QtWidgets>

class WaterWidget : public QWidget {
public:
    WaterWidget(QWidget *parent = nullptr) : QWidget(parent) {
        m_timer.setInterval(20);
        connect(&m_timer, &QTimer::timeout, this, &WaterWidget::animate);
    }

protected:
    void paintEvent(QPaintEvent *) override {
        QPainter painter(this);
        painter.setRenderHint(QPainter::Antialiasing);
        painter.fillRect(rect(), Qt::blue);

        for (int i = 0; i < m_drops.size(); i++) {
            QPoint pos(m_drops[i].x(), height() - m_drops[i].y());
            painter.setBrush(Qt::white);
            painter.drawEllipse(pos, m_dropSize, m_dropSize);
        }
    }

    void mousePressEvent(QMouseEvent *event) override {
        if (event->button() == Qt::LeftButton) {
            QPointF pos = event->localPos();
            if (pos.y() > height() / 2)
                return;

            m_drops.push_back(QPointF(pos.x(), height() - pos.y()));
            update();
        }
    }

private:
    QTimer m_timer;
    QList<QPointF> m_drops;
    int m_dropSize = 10;

    void animate() {
        for (int i = 0; i < m_drops.size(); i++) {
            QPointF &p = m_drops[i];
            p.setY(p.y() + 5);

            // Remove drops that have fallen off the bottom
            if (p.y() > height())
                m_drops.removeAt(i--);
        }

        update();
    }
};

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    WaterWidget widget;
    widget.resize(400, 300);
    widget.show();

    return app.exec();
}

这个示例创建了一个WaterWidget类,它继承自QWidget。在paintEvent函数中,首先用蓝色填充整个窗口作为水面的背景。然后遍历所有水滴的位置,使用白色画刷绘制圆形水滴。

当用户单击窗口时,会在鼠标位置添加一个新的水滴。

每隔20毫秒,定时器就会调用animate函数。在此函数中,每个水滴都向下移动一些距离,并删除已经掉落到底部的水滴。

运行该应用程序后,您可以单击窗口来添加新的水滴,并观察它们如何移动和消失。

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?