提要
在窗口上悬浮鼠标,此时窗口标题栏显示,窗口变大,鼠标移开后,窗口恢复原来的大小,标题栏隐藏。
示例
直接上代码,只包含只要的代码部分。
在自定义的窗口中重写鼠标进入事件enterEvent和鼠标离开事件leaveEvent,在其内部实现窗口的变大,恢复。
在构造函数中将标题栏隐藏。
ui->titleWidget为自定义标题栏。
ui->titleWidget->hide();
//变量定义
QRect m_oldSizePos;//保存之前的窗口大小
bool m_isFloatWin;//是否有窗口浮动
#define BASE_W 1920//基本屏幕分辨率
#define BASE_H 1080
#define FLOATWIN_RANGE 800//悬浮窗口的区域为800x800的矩形框内呈现悬浮窗口//其中 m_percentW = (qreal)BASE_W / screen.width();
// m_percentH = (qreal)BASE_H / screen.height();为
//1920x1080与当前屏幕分辨率的比值,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();//最大值是否小于浮动窗口的区域,小于出现浮动窗口,大于不需要出现浮动窗口if(max < FLOATWIN_RANGE)//FLOATWIN_RANGE一个宏,值为700,可以自己设{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 / m_percentW){rectWin.moveLeft(SCENE_W / m_percentW - rectWin.width());//setX会改变矩形的宽所以没有使用}if(rectWin.y() + rectWin.height() > SCENE_H / m_percentH){rectWin.moveTop(SCENE_H /m_percentH - rectWin.height());//设置y值}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;}
}
以上可以将原来的窗口在鼠标悬浮时放大并显示标题栏,鼠标移开窗口,窗口恢复之前的大小。