当前位置:   article > 正文

Qt实现浮动窗口_qt浮动窗口

qt浮动窗口

提要

在窗口上悬浮鼠标,此时窗口标题栏显示,窗口变大,鼠标移开后,窗口恢复原来的大小,标题栏隐藏。

示例

直接上代码,只包含只要的代码部分。
在自定义的窗口中重写鼠标进入事件enterEvent和鼠标离开事件leaveEvent,在其内部实现窗口的变大,恢复。
在构造函数中将标题栏隐藏。
ui->titleWidget为自定义标题栏。

ui->titleWidget->hide();
  • 1
//变量定义
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;//最长的边为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 / 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;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63

以上可以将原来的窗口在鼠标悬浮时放大并显示标题栏,鼠标移开窗口,窗口恢复之前的大小。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/喵喵爱编程/article/detail/962551
推荐阅读
相关标签
  

闽ICP备14008679号