先看效果:
N年前的QQ就可以吸附到屏幕边缘,聊天时候非常方便,不用点击状态栏图标即可呼出QQ界面
自己尝试做了一个糙版的屏幕吸附效果。
关键代码:
void Widget::mouseMoveEvent(QMouseEvent *e)
{
int dx = e->globalX() - lastPoint_.x();
int dy = e->globalY() - lastPoint_.y();
int targetx,targety;
bool enableAnimation = false;
if(mousePress_ == false) {
return;
}
//! 垂直方向
if(this->y() < EdgeAttachMargin && this->y() != 0) {
//! 吸附顶部
targety = 0;
enableAnimation = true;
} else {
targety = this->y();
}
//! 水平方向
if(this->x() < EdgeAttachMargin && this->x() != 0) {
//! 吸附左边
enableAnimation = 1;
targetx = 0;
} else {
int rightx = this->x()+this->width();
if(rightx > (QApplication::desktop()->width()-EdgeAttachMargin) && rightx != QApplication::desktop()->width()) {
//! 吸附右边
targetx = QApplication::desktop()->width()-this->width();
enableAnimation = 1;
} else {
targetx = this->x();
}
}
if(1 == enableAnimation){
if(targetx == 0) {
hideType_ = HideType::to_xleft;
} else if(targetx == QApplication::desktop()->width()-this->width()) {
hideType_ = HideType::to_xright;
} else if(targety == 0) {
hideType_ = HideType::to_y;
}
startAnimation(QPoint(targetx,targety),QPoint(this->x(),this->y()));
} else {
if(hideType_ == HideType::xleft) {
int adjustX = x();
int adjustY = y() + dy;
if(dx > EdgeAttachMargin) {
adjustX = x() + dx;
hideType_ = HideType::none;
lastPoint_.rx() = e->globalX();
}
this->move(adjustX, adjustY);
lastPoint_.ry() = e->globalY();
} else if (hideType_ == HideType::xright) {
int adjustX = x();
int adjustY = y() + dy;
if(dx < -EdgeAttachMargin) {
adjustX = x() + dx;
hideType_ = HideType::none;
lastPoint_.rx() = e->globalX();
}
this->move(adjustX, adjustY);
lastPoint_.ry() = e->globalY();
} else if(hideType_ == HideType::y) {
int adjustX = x() + dx;
int adjustY = y();
if(dy > EdgeAttachMargin) {
adjustY = y() + dy;
hideType_ = HideType::none;
lastPoint_.ry() = e->globalY();
}
this->move(adjustX, adjustY);
lastPoint_.rx() = e->globalX();
} else {
int adjustX = x() + dx;
int adjustY = y() + dy;
if(adjustX < 0) adjustX = 0;
if(adjustX > QApplication::desktop()->width() - width()) adjustX = QApplication::desktop()->width() - width();
if(adjustY < 0) adjustY = 0;
if(adjustY > QApplication::desktop()->availableGeometry().height() - height()) adjustY = QApplication::desktop()->availableGeometry().height() - height();
this->move(adjustX, adjustY);
lastPoint_ = e->globalPos();
}
}
}
鼠标悬停展开 / 离去收缩功能,
主要依据void enterEvent(QEvent *event); & void leaveEvent(QEvent *event);两个函数展开
动画效果使用QPropertyAnimation进行,可以参见另一篇博文中的例子:https://blog.csdn.net/wisdomroc/article/details/135975578
全套代码链接:Qt实现窗口吸附屏幕边缘 & 自动收缩