提要
鼠标进入窗口后,窗口放大,且出现标题栏,鼠标移开,窗口标题栏隐藏,窗口还原。对于放大后超出显示区域的窗口,将窗口进行移动,使其在显示区域内。对于可以看清的窗口,只浮动显示标题栏,不进行放大,默认认为窗口在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;//最长的边为700int 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后,不用考虑左上角坐标出现在显示区域外的情况,也属于一种偷懒行为吧,但适用于我目前的项目,视情况而定了可酌情增删代码。