提要
鼠标进入窗口后,窗口放大,且出现标题栏,鼠标移开,窗口标题栏隐藏,窗口还原。对于放大后超出显示区域的窗口,将窗口进行移动,使其在显示区域内。对于可以看清的窗口,只浮动显示标题栏,不进行放大,默认认为窗口在700x700时可以看清。
示例
只展示关键代码。
void CustomWidget::enterEvent(QEvent *event)
{
ui->titleWidget->show();
//保存原来的窗口大小位置
m_oldSizePos = geometry();
//获取窗口左上角坐标(场景坐标)
QRect rectWin = geometry();
outPut<<"矩形的宽:"<<rectWin.width()<<"高:"<<rectWin.height()<<"x:"<<rectWin.x()<<"y:"<<rectWin.y();
//求出窗口宽高的最大值
int max = rectWin.width() > rectWin.height() ? rectWin.width():rectWin.height();
//最大值是否小于浮动窗口的区域700x700,小于出现浮动窗口,大于不需要出现浮动窗口
if(max < FLOATWIN_RANGE)
{
max = FLOATWIN_RANGE;//最长的边为700
int otherLen;//另一边长
if(rectWin.width() >= rectWin.height())//宽大与高
{
otherLen = (float)FLOATWIN_RANGE / rectWin.width() * rectWin.height();
rectWin.setWidth(max);
rectWin.setHeight(otherLen);
}
else//高大于宽
{
otherLen = (float)FLOATWIN_RANGE / rectWin.height() * rectWin.width();
rectWin.setWidth(otherLen);
rectWin.setHeight(max);
}
if(rectWin.x() + rectWin.width() > SCENE_W)
{
rectWin.moveLeft(SCENE_W - rectWin.width());//setX会改变矩形的宽
}
if(rectWin.y() + rectWin.height() > SCENE_H)
{
rectWin.moveTop(SCENE_H - rectWin.height());
}
setGeometry(rectWin);
m_isFloatWin = true;
}
outPut<<"矩形放大后宽:"<<rectWin.width()<<"高:"<<rectWin.height()<<"x:"<<rectWin.x()<<"y:"<<rectWin.y();
}
void CustomWidget::leaveEvent(QEvent *event)
{
ui->titleWidget->hide();
if(m_isFloatWin)
{
//窗口恢复大小
setGeometry(m_oldSizePos);
outPut<<"矩形恢复之前的宽:"<<m_oldSizePos.width()<<"高:"<<m_oldSizePos.height()<<"x:"<<m_oldSizePos.x()<<"y:"<<m_oldSizePos.y();
m_isFloatWin = false;
}
}
其中变量m_isFloatWin 初始化为false,其中enterEvent和leaveEvent为鼠标进入事件和鼠标离开事件。FLOATWIN_RANGE为定义的宏700,出现的浮动窗口的范围在700x700内,这样就不用考虑过大的窗口,如何出现浮动窗口,以及显示区域定义的长宽大于700后,不用考虑左上角坐标出现在显示区域外的情况,也属于一种偷懒行为吧,但适用于我目前的项目,视情况而定了可酌情增删代码。