要实现水流流动的效果,可以使用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函数。在此函数中,每个水滴都向下移动一些距离,并删除已经掉落到底部的水滴。
运行该应用程序后,您可以单击窗口来添加新的水滴,并观察它们如何移动和消失。