一个窗口在另一个窗口上移动,可左移亦可右移,效果如下:
实现机制:通过定时器控制,上层窗口不停的在下层窗口上 move N个像素,窗口关系可以是父子关系。
核心代码`
m_MoveOut.setTimerType(Qt::PreciseTimer);
m_MoveOut.setInterval(8);
connect(&m_MoveOut, &QTimer::timeout, this, [this] {
QPoint pos = QPoint(m_posX, m_posY);
move(pos);
if (m_Direction) { //右移
m_posX -= 1; //移动速度
}
else { //左移
m_posX += 1;
}
//处理边界问题,不让窗口移动出下一层窗口
if (m_posX < 0)
{
if (m_posX < -1)
move(QPoint(0, m_posY));
m_posX = 0;
m_MoveOut.stop();
}
});
void TxtMoveTest::toStartMoveTimer(bool s, int x, int y)
{
m_Direction = s;
if (x != 0 && y != 0) {
m_posX = x;
m_posY = y;
}
m_MoveOut.start();
}
如果窗口涉及到排队处理,建议通过线程去启动定时器,防止出现不同步的问题(部分代码如下)
connect(&m_threadFloat, SIGNAL(started()), &m_MoveOut, SLOT(start()), Qt::UniqueConnection);
connect(&m_threadFloat, SIGNAL(finished()), &m_MoveOut, SLOT(stop()), Qt::UniqueConnection);
m_MoveOut.moveToThread(&m_threadFloat);
m_threadFloat.start();
测试代码
connect(ui.pushButton_test, &QPushButton::clicked, this, [=]() {
if (s_first) {
m_txt->toStartMoveTimer(s, 120, 140);
s_first = !s_first;
}
else {
m_txt->toStartMoveTimer(s);
}
s = !s;
m_txt->show();
});