假设某个封闭容器内有若干个分子,每个分子的颜色都不同,它们在容器内无规则的扩散,如何实现这个功能? 解决方案如下:
1. 容器可视为一个QWidget对象,每个分子可用一个圆点表示,它的结构体数据如下:
struct SColorCircle
{
SColorCircle(QPoint pt, Qt::GlobalColor clr) : _pt(pt), _color(clr) {}
QPoint _pt;
int _radius = 10;
Qt::GlobalColor _color;
};
2.重写QWidget继承类的paintEvent 函数,绘制分子;
void DiffusionWgt::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event);
int wid = width();
int hgt = height();
QPainter painter(this);
painter.setPen(Qt::black);
painter.drawRect(0, 0, wid - _frmWid, hgt - _frmWid);
randPoints();
foreach(const auto &e, _lstPoint)
{
painter.setPen(e._color);
painter.setBrush(QBrush(e._color));
painter.drawEllipse(e._pt.x(), e._pt.y(), e._radius, e._radius);
}
}
void DiffusionWgt::randPoints()
{
int wid = width();
int hgt = height();
qsrand(QTime(0, 0, 0).msecsTo(QTime::currentTime()));
for (auto& e : _lstPoint)
{
QPoint& pt = e._pt;
pt.setX(qrand() % wid);
pt.setY(qrand() % hgt);
if (pt.x() < _frmWid)
{
pt.setX(_frmWid);
}
if (pt.y() < _frmWid)
{
pt.setY(_frmWid);
}
if (pt.x() > wid - e._radius - 2 * _frmWid)
{
pt.setX(wid - e._radius - _frmWid);
}
if (pt.y() > hgt - e._radius - 2 * _frmWid)
{
pt.setY(hgt - e._radius - _frmWid);
}
}
}
3.添加一个定时器,实时刷新分子的位置.
资源下载路径如下:
https://download.csdn.net/download/ouyangxiaozi/21111456