Qt可悬浮工具按钮

小王子🤴 2020-09-20 21:39:52 9106
Qt可悬浮工具按钮

仿制360悬浮按钮,可以在软件呢随意移动的悬浮按钮:
原理:
控件置顶,重写点击事件、移动事件,在鼠标点击移动事件中监控鼠标位置,鼠标点击移动时将控件移动到鼠标的位置。
代码实现:

#ifndef QToolButtonEx_H
#define QToolButtonEx_H
#include <QPushButton>
#include <QMouseEvent>
#include <QDebug>

class QToolButtonEx : public QPushButton
{
public:
    QToolButtonEx(QWidget *parent = nullptr);
    ~QToolButtonEx();
    virtual void mousePressEvent(QMouseEvent *event);
    virtual void mouseReleaseEvent(QMouseEvent *event);
//    virtual void mouseDoubleClickEvent(QMouseEvent *event);
    virtual void mouseMoveEvent(QMouseEvent *event);
signals:
//    void moveSignals();
private:
    QPoint m_start;//起始点
    QPoint m_end;//结束点
    bool m_leftButtonPressed;//鼠标左键按下标记
    bool isMove = false;

};

#endif // QToolButtonEx_H

#include "QToolButton.h"

QToolButtonEx::QToolButtonEx(QWidget *parent):QPushButton(parent)
{
    setWindowFlag(Qt::WindowStaysOnTopHint);

    this->resize(200,200);

    setStyleSheet("background:transparent");
    setIcon(QIcon(":/new/prefix1/bird"));
    setIconSize(QSize(200,200));
}

QToolButtonEx::~QToolButtonEx()
{

}

void QToolButtonEx::mousePressEvent(QMouseEvent *event)
{
    // 鼠标左键按下事件
    if (event->button() == Qt::LeftButton)
    {
        isMove = false;
        // 记录鼠标左键状态
        m_leftButtonPressed = true;
        //记录鼠标在屏幕中的位置
        m_start = event->globalPos();
//        m_start = event->pos();
    }

}

void QToolButtonEx::mouseReleaseEvent(QMouseEvent *event)
{
    // 鼠标左键释放
    if (event->button() == Qt::LeftButton)
    {
        if(!isMove)
            emit released();
        // 记录鼠标状态
        m_leftButtonPressed = false;
        isMove = false;
    }
}

void QToolButtonEx::mouseMoveEvent(QMouseEvent *event)
{
    // 持续按住才做对应事件
      if(m_leftButtonPressed)
      {
          QSize size = this->size();//当前窗口大小
          QSize parentSize = this->parentWidget()->size();//父窗口大小
          QPoint curPos = geometry().topLeft() + (event->globalPos() - m_start);//移动后的位置
          if(curPos.x() < 0)//left
              curPos.setX(0);

          if(curPos.y() < 0)//top
              curPos.setY(0);

          if( (curPos.x()+size.width()) > parentSize.width())//right
              curPos.setX(parentSize.width() - size.width());

          if( (curPos.y()+size.height()) > parentSize.height())//bottom
              curPos.setY(parentSize.height() - size.height());

          move(curPos);//移动
          isMove = true;
//          //将鼠标在屏幕中的位置替换为新的位置
          m_start = event->globalPos();
      }
}
声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
红包 点赞 收藏 评论 打赏
评论
0个
内容存在敏感词
手气红包
    易百纳技术社区暂无数据
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
小王子🤴
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区