用过qq的同学都知道,qq主窗口在靠近界面边缘时会自动隐藏,而当鼠标再一次进入的时候会自动弹出,接下来我将记录下自己实现的类似同样的功能,支持多屏幕靠边隐藏。文章末尾我提供了demo的下载地址,这个样例我是从网上下载下来,并自己进行了优化,主要针对边界判断和多屏幕支持。
下面是我做的效果展示,由于录屏软件录制屏幕顶端不好录制,所以录制了屏幕左侧,我自己测试的结果是:屏幕左、屏幕上和屏幕右都没有问题。如果发现问题的同学可以联系我。
效果预览
![](https://i-blog.csdnimg.cn/blog_migrate/08e61167061a38003818faf4846ecc72.gif)
接下来我将每一步的实现代码分别做以解释:
一、窗口移动
做windows桌面程序的同学,应该都会这个功能,不过我还是贴一下代码吧,虽然不是特别复杂。要实现这个功能只需要重写3个方法,分别是:mousePressEvent、mouseMoveEvent和mouseReleaseEvent。
1、mousePressEvent
void FloatingWidget::mousePressEvent(QMouseEvent *e)
{
if (e->button() == Qt::LeftButton)
{
m_dragPosition = e->globalPos() - frameGeometry().topLeft();
e->accept();
}
}
2、mouseMoveEvent
void FloatingWidget::mouseMoveEvent(QMouseEvent * event)
{
if (event->buttons() & Qt::LeftButton)
{
QPoint pos = event->globalPos() - m_dragPosition;
QDesktopWidget * desktop = qApp->desktop();
QRect rect = desktop->screenGeometry(QCursor::pos());
QRect frameRect = frameGeometry();
if (rect.top() >= pos.y())//修正顶端位置
{
pos.setY(rect.top());
}
if (rect.left()>= pos.x())//修正左侧位置
{
int leftScreenNumber = desktop->screenNumber(pos - QPoint(width(), 0));
if (desktop->screenGeometry(leftScreenNumber).contains((pos - QPoint(width(), 0))) == false)