Qt窗口设置无边框不能移动,鼠标穿透后不能响应点击事件

思路实现

  最近在做一个迷你小工具,准备干点不可描述的事情,想要短小强悍,始终在最顶层显示,同时不要自带的关闭按钮和边框,百度一下,发现是需要设置如下两个属性:

setWindowFlags(Qt::WindowStaysOnTopHint|Qt::FramelessWindowHint);

  那么问题来了,这样的话一运行窗体就在正中间,而且无法拖动,就像这样
在这里插入图片描述
  哪怕对于我这种小卡拉米来说也是无法忍受的,毕竟是一去、二三里的铁杆粉丝,不能给他丢人,一个字干!
  首先呢,想到的是重写鼠标的点击事件,释放事件,我这里写的比较简洁使用,网上很多写的有点复杂了,两个函数的声明和定义如下
widget.h

pulic:
void mousePressEvent(QMouseEvent *e);
void mouseReleaseEvent(QMouseEvent *e);private:
bool m_bIsPressed;	//鼠标按下标志位
QPoint m_lastPt;	//记录第一次鼠标按下的局部坐标

widget.cpp

void Widget::mousePressEvent(QMouseEvent *e)
{m_bIsPressed = true;	//鼠标被按下m_lastPt = e->pos();	//记录鼠标第一次按下的局部坐标(相对于小窗体,非全局坐标)
}void Widget::mouseReleaseEvent(QMouseEvent *e)
{if(m_bIsPressed){move(e->globalPos() - m_lastPt);	//松开鼠标时,移动到鼠标的全局位置减去之前的局部相对位置}m_bIsPressed = false;	//鼠标按下标志位还原置为false
}

  感觉应该没鸡毛问题了,拖拽一下可以移动窗体,但是只有很小的一部分漏在界面控件区域之外的widget区域可以移动,鼠标点击按钮或者编辑框拖拽则没有效果,这能忍吗?当然不能,继续干!
  直接ChatGPT,好吧封号了,继续百度,百度上一堆的解决办法,都在说一件事,那就是鼠标穿透,我界面一共就三个按钮和两个编辑框,于是我一通Ctrl+C和Ctrl+V修改改控件名,设置各个子控件的穿透属性,代码如下

    ui->btn_getIP->setAttribute(Qt::WA_TransparentForMouseEvents, true);ui->btn_contact->setAttribute(Qt::WA_TransparentForMouseEvents, true);ui->btn_exit->setAttribute(Qt::WA_TransparentForMouseEvents, true);ui->lineEdit->setAttribute(Qt::WA_TransparentForMouseEvents, true);ui->lineEdit_2->setAttribute(Qt::WA_TransparentForMouseEvents, true);

  我又感觉应该没鸡毛问题了,运行了一下,发现可以,正在笑眯眯的准备手工的时候,点击了一下退出按钮,啥?点不动?点了没反应,我再试下其他的控件,好吧,按钮都无法点击,编辑框文字都无法选中复制,我tm心态崩了呀!这能忍吗?当然不能,继续冲!
  百度了一圈都是没有这方面的,看来只能靠自己了,想了一个巧妙的办法,那就是鼠标点击在那个区域,判断下那个区域按钮是否包含当前点击的点,包含就执行该按钮的点击槽函数,试了下,完全OK,代码加在鼠标的点击事件下

void Widget::mousePressEvent(QMouseEvent *e)
{m_bIsPressed = true;m_lastPt = e->pos();if(ui->btn_getIP->geometry().contains(e->pos())){on_btn_getIP_clicked();}if(ui->btn_contact->geometry().contains(e->pos())){on_btn_contact_clicked();}if(ui->btn_exit->geometry().contains(e->pos())){on_btn_exit_clicked();}
}

  运行了下,所有按钮都可以响应点击事件,同时鼠标点击拖拽也能移动主窗体,完美解决!如果本文章帮到解决问题了,请随手点下关注和赞,蟹蟹!


Tips:

  MousePressEvent如果加了按钮响应事件,可能会造成先执行后移动,甚至来不及移动,比如退出按钮,或者弹窗按钮等,建议MousePressEvent事件里记录当前按下的位置是那个按钮的区域信息,会触发那个槽函数,在MouseRelease鼠标释放事件中去执行,这样才是最完美的。

完整代码

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QMouseEvent>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();void mousePressEvent(QMouseEvent *e);void mouseReleaseEvent(QMouseEvent *e);private slots:void on_btn_exit_clicked();void on_btn_contact_clicked();void on_btn_getIP_clicked();private:Ui::Widget *ui;bool m_bIsPressed;  //鼠标按下标志位QPoint m_lastPt;    //记录第一次鼠标按下的局部坐标bool m_bIsBtnGetIP;     //点击了获取IP按钮bool m_bIsBtnContact;   //点击了联系作者按钮bool m_bIsBtnExit;      //点击了退出按钮
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QMessageBox>
#include <QDebug>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);setWindowFlags(Qt::WindowStaysOnTopHint|Qt::FramelessWindowHint);m_bIsPressed = false;m_bIsBtnGetIP = false;m_bIsBtnContact = false;m_bIsBtnExit = false;ui->btn_getIP->setAttribute(Qt::WA_TransparentForMouseEvents, true);ui->btn_contact->setAttribute(Qt::WA_TransparentForMouseEvents, true);ui->btn_exit->setAttribute(Qt::WA_TransparentForMouseEvents, true);
}Widget::~Widget()
{delete ui;
}void Widget::mousePressEvent(QMouseEvent *e)
{m_bIsPressed = true;m_lastPt = e->pos();//判断点击的位置是否是子控件的区域,如果是,则将对应的标志位置为true,在鼠标的释放事件中去实现if(ui->btn_getIP->geometry().contains(e->pos())){m_bIsBtnGetIP = true;}if(ui->btn_contact->geometry().contains(e->pos())){m_bIsBtnContact = true;}if(ui->btn_exit->geometry().contains(e->pos())){m_bIsBtnExit = true;}
}void Widget::mouseReleaseEvent(QMouseEvent *e)
{if(m_bIsPressed){move(e->globalPos() - m_lastPt);}m_bIsPressed = false;if(m_bIsBtnGetIP){on_btn_getIP_clicked();}m_bIsBtnGetIP = false;if(m_bIsBtnContact){on_btn_contact_clicked();}m_bIsBtnContact = false;if(m_bIsBtnExit){on_btn_exit_clicked();}m_bIsBtnExit = false;
}void Widget::on_btn_exit_clicked()
{close();
}void Widget::on_btn_contact_clicked()
{QMessageBox msgBox;msgBox.setText("粘贴购买生成的api地址到上方的api接口处,百度熊猫IP代理等等,点击获取IP即可到剪切板");//TodomsgBox.exec();
}void Widget::on_btn_getIP_clicked()
{//暂不公布哈
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/64908.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为董事长:已攻克!

上一篇&#xff1a;阿里P8高级技术专家自述被裁员&#xff0c;疑似给市长写信&#xff0c;房贷月供3w&#xff0c;压力很大&#xff0c;出门面试找工作很难&#xff01; 近日&#xff0c;华为传出大消息&#xff0c; 已攻克部分自主替代关键环节&#xff01; 日前&#xff0c;华…

全网最详细中英文ChatGPT-GPT-4示例文档-智能多功能学习机从0到1快速入门——官网推荐的48种最佳应用场景(附python/node.js/curl命令源代码,小白也能学)

从0到1快速入门智能多功能学习机应用场景 Introduce 简介setting 设置Prompt 提示Sample response 回复样本API request 接口请求python接口请求示例node.js接口请求示例curl命令示例json格式示例 其它资料下载 ChatGPT是目前最先进的AI聊天机器人&#xff0c;它能够理解图片和…

小娜再见!微软8年语音助手被判死刑,Windows Copilot本月开始预览

丰色 发自 凹非寺量子位 | 公众号 QbitAI 在时代巨轮ChatGPT的碾压之下&#xff1a; 微软Windows系统已诞生八年的语音助手“小娜”要化作一缕尘埃了。 就在这两天&#xff0c;官方宣布&#xff1a; 到今年年底&#xff0c;Windows系统将不再支持Cortana程序&#xff08;即“小…

阿里系-淘宝接口抓取及相关问题

阿里系-淘宝接口抓取 一、安装charlse抓包工具 官方下载地址 安装证书 二、安装xposed hook框架 Xponsed简介 具体安装步骤 三、安装模块 关闭阿里系ssl验证 开启http模式 支持支付宝、淘宝、淘宝直播各个接口抓取 四、效果如下 接下去一段时间更新阿里系相关接口 文章目录 一、…

Bito(GPT-4) 的下载、安装与使用

Bito AI使用说明 Bito是由Chat-GPT团队专IDE开发的AI编码插件&#xff0c;通过将GTP-4和ChatGPT引入IDE或者CLI来帮助开发人员高效、高质量的进行编码工作&#xff0c;可以显著提高编码速度和代码质量。我们使用OpenAI的模型&#xff0c;且你不需要有OpenAI的密钥。 官网地址&a…

【代码+方案+思考】Discord 运营及个性化方案

文章目录 前言一、Discord Bot1. 获取 Token2. 连接API测试3. Bot自动回复4. Bot音频播放5. Bot回复Button6. Bot 接入ChatGPT7. Bot 显示个人简介8. Bot 发送附件/Coin限制/内容信息板10. 特别笔记1) 同时使用client.event和client.command 前言 要做好海外产品需要更好个性化…

烟雾弹?突然转变?如何看待微软发声:中国是主要的对手

是的&#xff0c;我又回来了&#xff0c;今天要跟各位唠的还是ChatGPT的嗑。今天的新闻是啥呢&#xff1f; 《微软总裁&#xff1a;中国将是 ChatGPT 的主要对手&#xff0c;我们的优势不大》 说实话&#xff0c;我看到这个新闻的时候&#xff0c;大感震撼&#xff0c;在相关报…

GitHub/GitLab同天宣布裁员,最高比例10%!GitHub所有办公室不再续租

明敏 发自 凹非寺量子位 | 公众号 QbitAI 一天之内&#xff0c;原本是老对手的GitHub、GitLab&#xff0c;双双宣布裁员计划。 比例分别是10%和7%。 预计将有300人离开GitHub&#xff0c;100人告别GitLab。 裁员原因十分一致&#xff1a;调整预算。 GitHub还宣布&#xff0c;所…

真实大揭秘:生成式AI到底对网络安全行业造成了哪些影响?

聚焦源代码安全&#xff0c;网罗国内外最新资讯&#xff01; 作者&#xff1a;ELIAS GROLL、CHRISTIAN VASQUEZ 和AJ VICENS 编译&#xff1a;代码卫士 在网络安全行业&#xff0c;放眼望去&#xff0c;无论是大会、交易博览会还是新闻头条&#xff0c;规模最大的企业都在声称&…

GTC23 | NVIDIA 与合作伙伴携手升级 Omniverse,为艺术家和开发者优化 3D 工作流奠定基础

Omniverse 平台进行重大更新&#xff0c;将新增生成式 AI、模拟和工业元宇宙访问入口。 基于 NVIDIA Omniverse&#xff08;创建和运行元宇宙应用的平台&#xff09;中全新的 Omniverse Connectors 及其他更新&#xff0c;开发者与创作者可以更好地挖掘生成式 AI、模拟和工业元…

垃圾分类数据集

训练集的制作是一件成本很高的事情&#xff0c;下面是一份包括4大类40个小类的垃圾数据集。

垃圾分类图片数据集

该图片数据集是作者自己收集整理的&#xff0c;一共有四个大文件夹&#xff0c;对应着不同的垃圾类别&#xff0c;每个文件夹中有各自包含的垃圾名称及其图片&#xff0c;当前数据集一共有246种垃圾&#xff0c;共包含图片80961张&#xff0c;大家如果有相关研究需要可以自行下…

【图像识别与处理】构建用于垃圾分类的图像分类器

1 构建图像分类器 训练一个卷积神经网络&#xff0c;用fastai库&#xff08;建在PyTorch上&#xff09;将图像分类为纸板&#xff0c;玻璃&#xff0c;金属&#xff0c;纸张&#xff0c;塑料或垃圾。使用了由Gary Thung和Mindy Yang手动收集的图像数据集。数据集下载地址如下&…

ART运行时垃圾收集机制简要介绍和学习计划

为了学习ART运行时的垃圾收集机制&#xff0c;我们先把Dalvik虚拟机的垃圾收集机制研究了一遍。这是因为两者都使用到了Mark-Sweep算法&#xff0c;因此它们在概念上有很多一致的地方。然而在实现上&#xff0c;Dalvik虚拟机的垃圾收集机制要简单一些。这样我们就可以先从简单的…

【电子学会】2019年03月图形化二级 -- 垃圾分类

垃圾分类 垃圾分类已经成为我们日常生活中很重要的一部分,这对于环境保护、资源回收利用具有重要意义。 下面我们做一个简单的垃圾分类互动游戏。 1. 准备工作 (1)导入背景库中的“Mural”,并编辑该背景,增加如下图中的两个垃圾桶,注明“可回收垃圾”和“不可回收垃圾…

Android 垃圾分类APP(二)垃圾分类之手动输入

前言 在上一篇文章中进行了项目的搭建和网络请求的测试&#xff0c;还不错相信你一定可以完成。 正文 这篇文章要做的就是手动输入物品去完成垃圾分类的结果显示&#xff0c;也不会很难&#xff0c;我会讲的细一点。 一、修改样式 先配置一些资源&#xff0c;找到你的res下的…

第七届工程训练大赛垃圾分类

第七届全国大学生工程训练大赛垃圾分类 前言一、机械结构设计1.Solidworks建模2.建模的不足以及改进1.挡板的添加2.履带防滑 3.整体实物 二、视觉识别部分1.引入库2.识别部分 三、上下位机通信方式:1.高低电平通信&#xff1a;1.2高低电平树莓派部分:2.stm32串口通信部分&#…

昇腾应用案例体验:(3) 垃圾分类

昇腾AI应用&#xff0c;探索人工智能的无限可能&#xff0c;使能千行百业 垃圾分类 概述 垃圾分类是对垃圾收集处置传统方式的改革&#xff0c;是对垃圾进行有效处置的一种科学管理方法。人们面对日益增长的垃圾产量和环境状况恶化的局面&#xff0c;如何通过垃圾分类管理&a…

上海居民被垃圾分类逼疯!这款垃圾自动分类器也许能帮上忙

作者 | 视说君 来源 | 授权转载自视说AI&#xff08;ID:techtalkai&#xff09; 让垃圾自动分类 近期垃圾分类成为了一个热门话题&#xff0c;原来直接一次性扔掉的垃圾&#xff0c;现在都需要分门别类进行投放。从今年7月1日起&#xff0c;新的《上海市生活垃圾管理条例》正式…

深度学习:垃圾自动分类

导 言 垃圾分类&#xff0c;指按一定规定或标准将垃圾分类储存、分类投放和分类搬运&#xff0c;从而转变成公共资源的一系列活动的总称。这不仅是出于生态环境角度考虑&#xff0c;“没有垃圾&#xff0c;只有放错位置的资源”&#xff0c;分类收集后&#xff0c;不少垃圾都可…