qt浮动窗口

提要

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肩上风骋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值