zoukankan      html  css  js  c++  java
  • Qt 实现悬浮窗效果

    当鼠标移动到头像控件时,显示悬浮窗,当鼠标离开时,悬浮窗隐藏。

     
    1、控件选择
    悬浮窗可以从QDialog派生,并将窗口的属性设置为无边框
    this->setWindowFlags(this->windowFlags() | Qt::FramelessWindowHint);
    这样即使创建该悬浮窗的时候,传入parent,也不会嵌入到父控件中。
     
    2、计算位置
    头像控件重载函数
    void enterEvent(QEvent * event);
    当鼠标进入时,设置该显示窗的位置,显示该悬浮窗。
     
    因为pos()是相对于父控件的相对位置(位置都是左上角,因为屏幕的左上角为(0, 0))。
     
    对于Dialog而言,要获取屏幕的坐标,并移动到屏幕的坐标,额,我这样写才管用。
    1 QPoint oPoint = this->mapToGlobal(QPoint(0, this->height()));
    2 m_pWidget->move(oPoint);

     3、实现鼠标移走隐藏效果

    开始想在mousemoveEvent中处理,但是mousemoveEvent只有在鼠标进入到本控件的范围内的时候才起作用(前提是要setMouseTracking为true)。但是如果在enterEvent中和leaveEvent中处理显隐则导致鼠标进入不了悬浮窗就会隐藏。
     
    想了很久,看Qt文档看到QWidget中还有timer事件,那么实现这个效果的方法就可以为:
    (1)在显示悬浮窗的时候,开启timer比如一秒
    this->startTimer(1000);
    (2)在timerEvent中判断鼠标是否游离到了本控件和悬浮窗之外,如果游离出去了,那么隐藏窗口,并关闭timer。
     1 void GSJLoginPictureLabel::timerEvent(QTimerEvent * ev)
     2 {
     3     if ((m_pWidget != nullptr) && (m_pWidget->isVisible()))
     4     {
     5         QPoint oPoint = QCursor::pos();
     6         QPoint oSelfPoint = this->mapFromGlobal(oPoint);
     7         QPoint oWidgetPoint = m_pProjectWidget->mapFromGlobal(oPoint);
     8         QRect oSelfRect = this->rect();
     9         QRect oWidgetRect = m_pWidget->rect();
    10         if ((!oSelfRect.contains(oSelfPoint)) && (!oWidgetRect.contains(oWidgetPoint)))
    11         {
    12             m_pWidget->hide();
    13             killTimer(ev->timerId());
    14         }
    15     }
    16     else
    17     {
    18         killTimer(ev->timerId());
    19     }
    20 }
  • 相关阅读:
    二叉树序列化和反序列化
    js推箱子
    查找一个二叉树的后继节点
    采用非递归方式遍历二叉树
    采用递归方式遍历二叉树
    判断两个单向链表是否相交
    拷贝带随机指针的链表
    将单向链表按某值划分成左边小,中间相等,右边大的形式
    滑动窗口求最大值
    给定一个只包含字符’(’,’)’,’{’,’}’,’[‘和’]'的字符串,判断输入字符串是否有效
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/13565664.html
Copyright © 2011-2022 走看看