使用Qt创建悬浮窗口

在Qt中创建悬浮窗口(如无边框、可拖动的浮动面板或提示框)可以通过以下方法实现。以下是几种常见场景的解决方案:


方法1:使用无边框窗口 + 鼠标事件拖动

适用于自定义浮动工具窗口(如Photoshop的工具栏)。

#include <QWidget>
#include <QMouseEvent>class FloatingWindow : public QWidget {
public:FloatingWindow(QWidget *parent = nullptr) : QWidget(parent) {// 设置窗口无边框setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);// 设置半透明背景(可选)setAttribute(Qt::WA_TranslucentBackground);// 设置窗口尺寸resize(200, 150);// 添加内容(示例:添加一个标签)QLabel *label = new QLabel("悬浮窗口内容", this);label->setAlignment(Qt::AlignCenter);}protected:// 实现鼠标拖动窗口void mousePressEvent(QMouseEvent *event) override {if (event->button() == Qt::LeftButton) {m_dragPosition = event->globalPos() - frameGeometry().topLeft();event->accept();}}void mouseMoveEvent(QMouseEvent *event) override {if (event->buttons() & Qt::LeftButton) {move(event->globalPos() - m_dragPosition);event->accept();}}private:QPoint m_dragPosition;
};// 使用示例
int main(int argc, char *argv[]) {QApplication a(argc, argv);FloatingWindow window;window.show();return a.exec();
}

方法2:自定义ToolTip样式

当需要美化默认的悬浮提示时,可通过样式表或自定义QToolTip

通过样式表修改默认ToolTip
// 全局设置ToolTip样式
qApp->setStyleSheet("QToolTip {""   background: #FFFFCC;""   color: #333333;""   border: 1px solid #FFAA00;""   border-radius: 3px;""   padding: 2px;""}"
);// 为某个控件设置ToolTip
QPushButton *button = new QPushButton("Hover Me");
button->setToolTip("这是自定义样式的提示!");
创建自定义提示窗口

若需要更复杂的内容(如图片、按钮),可继承QWidget实现:

class CustomToolTip : public QWidget {
public:CustomToolTip(QWidget *parent = nullptr) : QWidget(parent) {setWindowFlags(Qt::ToolTip | Qt::FramelessWindowHint);setAttribute(Qt::WA_TranslucentBackground);QLabel *label = new QLabel("自定义提示内容", this);QVBoxLayout *layout = new QVBoxLayout(this);layout->addWidget(label);}
};// 在需要显示的地方触发
void showCustomToolTip(QWidget *target) {CustomToolTip *tip = new CustomToolTip(target);tip->move(target->mapToGlobal(QPoint(0, target->height())));tip->show();
}

方法3:结合事件过滤器实现悬停显示

当鼠标悬停在某个控件上时显示自定义悬浮窗口。

#include <QEvent>class HoverWidget : public QWidget {
public:HoverWidget(QWidget *parent = nullptr) : QWidget(parent) {setWindowFlags(Qt::ToolTip | Qt::FramelessWindowHint);hide(); // 初始隐藏}
};// 在父控件中安装事件过滤器
class MainWindow : public QWidget {
public:MainWindow() {QPushButton *button = new QPushButton("悬停显示窗口", this);m_hoverWidget = new HoverWidget(this);m_hoverWidget->resize(100, 50);// 安装事件过滤器到按钮button->installEventFilter(this);}protected:bool eventFilter(QObject *obj, QEvent *event) override {if (obj == sender()) { // 假设sender是目标按钮if (event->type() == QEvent::Enter) {// 显示悬浮窗口QPoint pos = mapToGlobal(sender()->pos());m_hoverWidget->move(pos.x(), pos.y() + 30);m_hoverWidget->show();} else if (event->type() == QEvent::Leave) {m_hoverWidget->hide();}}return QWidget::eventFilter(obj, event);}private:HoverWidget *m_hoverWidget;
};

关键配置说明

  1. 窗口标志(Window Flags)

    • Qt::FramelessWindowHint:隐藏标题栏和边框。
    • Qt::WindowStaysOnTopHint:窗口始终置顶。
    • Qt::ToolTip:短暂显示的提示窗口(无任务栏图标)。
  2. 透明背景

    setAttribute(Qt::WA_TranslucentBackground); // 允许透明
    
  3. 阴影效果

    // 通过样式表添加阴影
    setStyleSheet("QWidget {""   background: white;""   border: 1px solid #CCCCCC;""   border-radius: 4px;""}""QWidget::shadow {""   qproperty-shadow: 5px 5px 5px rgba(0,0,0,30);""}"
    );
    

注意事项

  • 内存管理:若悬浮窗口是临时创建的,需确保及时释放(例如通过Qt::ToolTip标志或设置父对象)。
  • 性能优化:频繁创建/销毁窗口可能影响性能,建议复用窗口实例。
  • 平台兼容性:某些标志(如透明背景)在某些平台上可能不生效。

通过上述方法,可灵活实现不同风格的悬浮窗口,满足工具提示、浮动面板等交互需求。

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

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

相关文章

《P4387 【深基15.习9】验证栈序列》

题目描述 给出两个序列 pushed 和 poped 两个序列&#xff0c;其取值从 1 到 n(n≤100000)。已知入栈序列是 pushed&#xff0c;如果出栈序列有可能是 poped&#xff0c;则输出 Yes&#xff0c;否则输出 No。为了防止骗分&#xff0c;每个测试点有多组数据&#xff0c;不超过 …

校园安全用电怎么保障?防触电装置来帮您

引言 随着教育设施的不断升级和校园用电需求的日益增长&#xff0c;校园电力系统的安全性和可靠性成为了学校管理的重要课题。三相智能安全配电装置作为一种电力管理设备&#xff0c;其在校园中的应用不仅能够提高电力系统的安全性&#xff0c;还能有效保障师生的用电安全&am…

【Git】--- 初识Git Git基本操作

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏&#xff1a; Git 本篇我们来初步认识Git企业级应用是什么&#xff0c;有什么用以及Git基本操作。 &#x1f3e0; 初始Git 提出问题 在日常生活中&#xff0c;我们进行…

数据治理下半场:如何用文化变革撬动企业数字化转型?

数据治理下半场:如何用文化变革撬动企业数字化转型? 一、打破认知茧房:从"数据恐惧症"到"数据生产力"二、重构协作生态:从"部门墙"到"数据共同体"三、建立责任体系:从"无人认领"到"终身责任制"​四、点燃创新…

Chat-Driven Business:灵活交互的新范式

1. 引言 一次偶然的机会&#xff0c;读到了CSDN上的一篇文章&#xff0c;自定义markdown的展示(很遗憾&#xff0c;时间有点久&#xff0c;找不到具体的链接了&#xff09;&#xff0c;当时我觉得这很有启发意义&#xff0c;因为我做的cli_assistant就是以markdown的形式返回的…

嵌入式裸机设计--MCU常用裸机架构有哪些?

为什么是裸机设计 792125321入群学习更高效&#xff01; 在MCU&#xff08;微控制器单元&#xff09;裸机开发中&#xff0c;我们常见的架构设计主要围绕如何高效管理资源和任务调度。认识这些开发方式&#xff0c;对我们开发一个小型项目来说及有好处&#xff01; 下面介绍…

python内置函数sum的用法

知识点 - sum 函数 基本语法 sum(iterable[, start]) iterable 是一个可迭代对象&#xff0c;例如列表、元组、集合等&#xff0c;其中的元素通常是数字类型&#xff08;整数或浮点数&#xff09;。 start 是一个可选参数&#xff0c;表示累加的起始值&#xff0c;默认为 0。…

编程语言的几种常见的分类方法

一、 按照编程范式分类 命令式编程语言 强调通过语句来改变程序状态&#xff0c;如 C、Pascal、Fortran 等。 面向对象编程语言 基于对象和类的概念&#xff0c;支持封装、继承和多态&#xff0c;如 Java、C、Python、Ruby 等。 函数式编程语言 注重不可变性和纯函数&#xf…

基于DeepSeek×MWORKS 2025a的ROM Builder自动化降阶实战

一、引言 当前&#xff0c;工业仿真领域正经历着前所未有的「智能焦虑」——当自动驾驶算法已能理解城市路网&#xff0c;当大模型开始设计蛋白质结构&#xff0c;这个驱动大国重器研发的核心领域&#xff0c;却仍在与千万级方程组成的庞杂模型艰难博弈。传统仿真降阶如同在数…

配置单区域OSPF实验和报文抓包和分析

一、配置单区域OSPF概念&#xff1a; &#xff08;1&#xff09;配置单区域OSPF&#xff08;Open Shortest Path First&#xff09;是一种常见的动态路由协议配置方式&#xff0c;主要用于在同一区域内实现路由信息的交换和路由表的更新。 &#xff08;2&#xff09;OSPF是一…

巴耶赫利专业俄语外贸网站建设

巴耶赫利是专业俄语外贸网站建设与俄语搜索引擎Yandex SEO优化服务商。巴耶赫利致力于帮助中国品牌出海俄罗斯&#xff0c;打开俄罗斯市场&#xff0c;提升品牌在俄罗斯的知名度和美誉度。 以下是对巴耶赫利相关服务的详细介绍&#xff1a; 一、巴耶赫利专业俄语外贸网站建设…

Netty基础—6.Netty实现RPC服务三

大纲 1.RPC的相关概念 2.RPC服务调用端动态代理实现 3.Netty客户端之RPC远程调用过程分析 4.RPC网络通信中的编码解码器 5.Netty服务端之RPC服务提供端的处理 6.RPC服务调用端实现超时功能 5.Netty服务端之RPC服务提供端的处理 (1)RPC服务提供端NettyServer (2)基于反射…

路由器与防火墙配置命令

路由器与防火墙配置命令 小明啊&#xff0c;你不是学计算机的嘛&#xff0c;叔叔家的路由器坏了&#xff0c;可以过来帮叔叔看看吗 命令可以用缩写&#xff0c;造就一堆容易造成歧义的缩写&#xff0c;比如add是address的缩写&#xff0c;sh是shutdown的缩写。 默认为Cisco路…

Go语言进化之旅:从1.18到1.24的语法变革

文章目录 里程碑变革&#xff1a;泛型支持Go 1.18&#xff1a;泛型的引入Go 1.19-1.21&#xff1a;泛型的完善Go 1.24&#xff1a;泛型类型别名全面支持 循环与迭代的进化Go 1.22&#xff1a;循环变量作用域变化与整数遍历Go 1.23&#xff1a;迭代器函数的支持Go 1.24&#xff…

发现一个GoVCL的问题

之前用govcl写了一个服务端的界面程序&#xff0c;用来控制服务的开启和关闭。 由于这个服务程序运行的时间比较长&#xff0c;经常是挂着在服务器上24小时不间断运行。 后来经过调试发现&#xff0c;govcl的界面按钮控件&#xff0c;在程序长时间运行后&#xff0c;会出现无法…

34个适合机械工程及自动化专业【论文选题】

论文选题具有极其重要的意义&#xff0c;它直接关系到论文的质量、价值以及研究的可行性和顺利程度。选题明确了研究的具体领域和核心问题&#xff0c;就像给研究旅程设定了方向和目的地。例如&#xff0c;选择 “人工智能在医疗影像诊断中的应用” 这一选题&#xff0c;就确定…

电脑实用小工具--VMware常用功能简介

一、创建、编辑虚拟机 1.1 创建新的虚拟机 详见文章新创建虚拟机流程 1.2 编辑虚拟机 创建完成后&#xff0c;点击编辑虚拟机设置&#xff0c;可对虚拟机内存、处理器、硬盘等各再次进行编辑设置。 二、虚拟机开关机 2.1 打开虚拟机 虚拟机创建成功后&#xff0c;点击…

双指针算法专题之——有效三角形的个数

文章目录 题目介绍思路分析AC代码 题目介绍 链接: 611. 有效三角形的个数 思路分析 如果判断三个数能否构成一个三角形&#xff0c;相信大家都知道&#xff1a; 只要任意两边之和大于第三边即可。 比如三条边长度为a&#xff0c;b&#xff0c;c 那只要满足 ab>c ac>b b…

Linux内核实时机制27 - RT调度器10 - RT throttling 带宽控制下

文章目录 1、初始化带宽 init_rt_bandwidth1.1、init_rt_bandwidth2、定时器处理2.1、sched_rt_period_timer2.2、do_sched_rt_period_timer3、总结1、初始化带宽 init_rt_bandwidth rt_runtime : 一个时间周期内的运行时间,超过则限流,默认值为0.95ms 1、init_rt_bandwidth…

1.5[hardware][day5]

Link类跳转指令可以拆分为两个部分&#xff0c;一个是跳转&#xff0c;即下一个PC的生成&#xff0c;如果将分支条件的比较放到译码级来进行&#xff0c;则这部分只涉及取值级和译码级流水&#xff1b;另一个是Link操作&#xff0c;简单来说就是写寄存器&#xff0c;这部则主要…