最近想着利用QT做一些界面显示,运动黑点和选中状态,貌似比较好实现得就是rect,然后用画笔给个颜色就ok了。
大概有五年没有玩QT了,果然很拉跨,大部分都不会用了,感觉已废,还得重新开始摸索,现在记录一下,省的以后再忘记怎么玩。
一、首先是点得实现
void BlackPoint::init()
{
setRect(QRect(1,1,1,1));
QPen pen = this->pen();
pen.setWidth(6);
pen.setColor(/*m_bChange?Qt::white :*/Qt::black);
this->setPen(pen);
this->setBrush(/*m_bChange?Qt::white :*/Qt::black);
int nX = random_app(0,500);
int nY = random_app(-500,0);
m_previous = random_app(0,8);
m_pPos.setX(nX);
m_pPos.setY(nY);
this->moveBy(nX,nY);
// this->setPos(m_pPos);
}
还加过一个 bool值 change变量,使用QTimer定时器,可以设置黑白显示,传说中我认为得闪烁,哈哈!
界面使用是QGraphicsView,使用QGraphicsSence 做画布。
QGraphicsRectItem 不断添加就是这个结果,考虑需要加自己得东西,所以我重载了一下这个类。
二、点得移动和边界问题
八方向问题可以是二维数组也可以降维到一维数组实现,只要找好实现都可以,我用得是一维数组实现。
三、如果实现随机移动
1、时间控制大概1分钟做一次方向重新计算
2、1分钟内遇到边界如何控制
3、速度得控制
void BlackPoint::update()
{
if(m_bShow)
return;
uint8_t bDirect = 0;
m_wContinueTime+=1000;
if(m_pPos.x() < 10 || m_pPos.x() >500 || m_pPos.y() <-550 || m_pPos.y() > -10)
{
check_pos_right();
m_wContinueTime = 0;
}
QPoint pos;
if(m_wContinueTime >= m_wTime)
{
int32_t nRand = random_app(0,8);
while(m_previous == nRand)
{
nRand = random_app(0,8);
}
bDirect = directArray[nRand];
pos = get_move_direct(bDirect) * m_wSpeed;
m_pPos.setX( m_pPos.x() + pos.x());
m_pPos.setY(m_pPos.y() + pos.y());
m_wContinueTime = 0;
m_previous = bDirect;
this->moveBy(pos.x(),pos.y());
}
else {
pos = get_move_direct(m_previous) * m_wSpeed;
m_pPos.setX( m_pPos.x() + pos.x());
m_pPos.setY(m_pPos.y() + pos.y());
this->moveBy(pos.x(),pos.y());
}
if(m_pChild)
{
m_pChild->moveBy(pos.x(),pos.y());
}
//this->setPos(m_pPos);
}
刚开始使用得是setPos,后面直接使用moveBy感觉是不是画面更平滑一些。
child是另一个QGraphicsRectItem。
位置判断有点散乱,是因为sence得坐标设置一直没有搞定,貌似一直是反过来得,可以考虑用mapto中得映射关系,暂时还没有去测试。
最终结果如图