QT2.3.10下冒泡式弹出式对户框的制作

Unity UI系统深度对比:uGUI与UI Toolkit核心机制、性能优化与实战选型指南 在游戏与应用开发中,用户界面(UI)系统是连接用户与程序的核心组件,其性能与开发效率直接影响产品体验。UI系统通常基于特定的渲染与布局原理构建,例如,基于游戏对象(GameObject)的组件化架构或基于即时模式与样式表的树状结构。理解其底层机制,如画布(Canvas)合批、视觉树(Visual Tree)管理及样式分离,对于实现高性能UI至关重要。这些技术能显著降低绘制调用(Draw Call),优化内存使用,并提升复杂界面的响应速度。其价值在于支撑数据密集型界面、高频交互场景及跨平台一致性的需求,广泛应 阅读详情

Qt2.3.10制作冒泡式弹出对话框

Snail    07年7月第一个星期制作

制作冒泡式弹出对话框主要涉及2个技术要点(主要供触摸屏使用)

1 实用的Qtimer类的使用(计算鼠标在对象上的停留时间确定是否弹出属性对话框)

2 漂亮的对话框的绘制(主要是QWidget::setMask(const QBitmap& bitmap)的使用)

 

详细分析:

QTimer类的使用

QTimer的一般性使用

QTimer *timer = new QTimer( myObject );

    connect( timer, SIGNAL(timeout()),

             myObject, SLOT(timerDone()) );

timer->start( 2000, TRUE );                 // 2 seconds single-shot

注意: 1 当myObject销毁时,Qtimer会自动销毁。不需要手工删除。

2         QTimer的 int start ( int msec, bool sshot = FALSE )  方法第二个参数sshot如果

为ture,则myObject的槽方法只会执行一次。不然的话会一直执行直到QTimer停止或者对象被销毁为止。

 

在本程序中如何使用QTimer类

//头文件

class MainPanel : public QWidget {                 // MainPanel为被测试面板,测试弹出属性框

         Q_OBJECT

public:

         MainPanel(QWidget *parent=0, const char *name=0, WFlags fl = 0);

         ~MainPanel() {}

public slots:

         void holdMouseToPopupDialog();            //供QTimer链接的槽,确定是否弹出属性框

protected:

         virtual void mousePressEvent ( QMouseEvent * );    //这三个虚函数需要被覆盖用作计时

         virtual void mouseReleaseEvent(QMouseEvent *);

         virtual void mouseMoveEvent(QMouseEvent *);

private:

         QPoint* __popupPoint;                     //弹出面板的坐标,也就是要显示属性的物体

         PopupInfoDialog* __propDialog;                //这个属性框的制作放到后面

         QTimer* __mouseHoldClicker;                 //创建一个Qtimer类成员对象

};

//代码文件

MainPanel::MainPanel(QWidget *parent, const char *name, WFlags fl) :QWidget(parent, name, fl) {

         __propDialog = new PopupInfoDialog(720,480,this,0,0,QDialog::WStyle_Customize | QDialog::WStyle_NoBorder | QDialog::WStyle_StaysOnTop);

         __mouseHoldClicker = new QTimer(this);                   

         __popupPoint = new QPoint();                                                      //创建一个默认弹出点

         connect(__mouseHoldClicker, SIGNAL(timeout()), this, SLOT(holdMouseToPopupDialog()));   //链接QTimer和面板

}

 

void MainPanel::mousePressEvent(QMouseEvent * e) {     //这个方法的意思是如果当鼠标按下(触摸屏的话就是手指按下)

         __popupPoint->setX(e->x());                               //保存当前的坐标点

         __popupPoint->setY(e->y());

         __propDialog->hide();                                    //隐藏以前出现的弹出式属性框

         __mouseHoldClicker->start(500, true);                     //以0.5秒计时,如果手指没有离开这个点,或者没有移动,则

                                                          //触发holdMouseToPopupDialog()槽一次。

}

 

void MainPanel::mouseReleaseEvent(QMouseEvent * e) {          //这个方法的意思是如果手指离开触摸屏,就。。。

         __mouseHoldClicker->stop();                   //如果在槽还没有触发前就停止计时器,这样不用弹出属性框了

}

 

void MainPanel::mouseMoveEvent(QMouseEvent * e) {            //这个方法的意思是如果手指移动了的话,就。。。。。。。。

         if (e->x()-__popupPoint->x()>5 || e->y()- __popupPoint->y()>5) {  //如果手指在5个像素内移动,就认为可接受的,如果超过5个

                   __mouseHoldClicker->stop();                           //像素,则不予弹出对话框

         }

}

 

void MainPanel::holdMouseToPopupDialog() {                    //测试面板的槽,用来弹出属性框

         __propDialog->popupAtPoint(__popupPoint->x(), __popupPoint->y());

         __propDialog->show();

}

 

 

在本程序中绘制漂亮的对话框

class PopupInfoDialog : public QDialog {

         Q_OBJECT

public:

         PopupInfoDialog (int areaWidth = 800 ,int areaHeight = 600,QWidget * parent=0, const char * name=0, bool modal=FALSE, WFlags f=0 );

         void popupAtPoint(int x,int y);

 

private:

         void __refreshMask(int popX, int popY);                        //重新刷新蒙板,隐藏对话框该的一些不需要显示的地方。

         void __fillArrow(QPainter&,int,int,int,int,int,int);                   //这个是画这个东东的---à

void PopupInfoDialog::popupAtPoint(int x, int y) {                   //对话框就弹出在这个点,在测试面板的             

//holdMouseToPopupDialog()中调用此方法。

         this->__refreshMask(x, y);

         this->show();

}

 

/*在这里,大致的实现过程是这样,QWidget可以通过一个QBitmap蒙板来大致决定需要显示哪些部分,我们就通过绘制蒙板来让QWidget显示蒙板同样大小区域来实现绘制任意形状的对话框的效果*/

 

void PopupInfoDialog::__refreshMask(int popX, int popY) {            //重新刷新蒙板

         QBitmap mask(__PopupWidth, __PopupHeight, true);             //创建一个蒙板

         QPainter painter(&mask);                                   

         painter.setPen(popupBorder);

         painter.setBrush(blackBrush);                                 //必须设置笔刷,得把绘制区域全部填充满

         painter.drawRoundRect(50, 0, 300, 300, 10, 10);//300是实际显示内容框,10为圆角矩形圆角半径

 

         int distanceToBorder;

         if (__areaWidth-popX >= __PopupWidth-50) {//右边能容纳弹出框  //这是一个简单的算法,在对象右边能显示对话框就在右边

                   if (popY <= __areaHeight/2) {//三角符号在弹出框的上边             //绘制属性对话框,不然就在左边绘制属性对话框。

                            if (popY <= __DialogToBorderDistance) {

                                     distanceToBorder = popY;

                            } else {

                                     distanceToBorder = __DialogToBorderDistance;

                            }

                            __fillArrow(painter, 0, popY-distanceToBorder+20, 50, 100-20, 50, 100+20);

                            this->move(popX, distanceToBorder);

                   } else {//三角符号在弹出框的下边

                            int dx = popX;

                            int dy = __areaHeight-__PopupHeight-__DialogToBorderDistance;

                            if ((__areaHeight - popY) <= __DialogToBorderDistance) {

                                     dy = __areaHeight-__PopupHeight-(__areaHeight - popY)+20;

                            }

                            __fillArrow(painter, 0, popY-(dy-20), 50, 200-20, 50, 200+20);

                            this->move(dx, dy);

                   }

         } else {//弹出框放在左边

                   if (popY <= __areaHeight/2) {//三角符号在弹出框的上边

                            if (popY <= __DialogToBorderDistance) {

                                     distanceToBorder = popY;

                            } else {

                                     distanceToBorder = __DialogToBorderDistance;

                            }

                            __fillArrow(painter, __PopupWidth, popY-distanceToBorder+20, __PopupWidth-51, 100-20, __PopupWidth-51,

                                               100+20);

                            this->move(popX-__PopupWidth, distanceToBorder);

                   } else {//三角符号在弹出框的下边

                            int dx = popX-__PopupWidth;

                            int dy = __areaHeight-__PopupHeight-__DialogToBorderDistance;

                            if ((__areaHeight - popY) <= __DialogToBorderDistance) {

                                     dy = __areaHeight-__PopupHeight-(__areaHeight - popY)+20;

                            }

                            __fillArrow(painter, __PopupWidth, popY-dy+20, __PopupWidth-51, 200-20, __PopupWidth-51, 200+20);

                            this->move(dx, dy);

                   }

         }

         this->clearMask();                                            //清除原来的蒙板效果

         this->setMask(mask);                                         //添加新的蒙板效果

}

 

/*这个方法通过在给定的三点绘制多边形,达到绘制属性框箭头的效果 */

void PopupInfoDialog::__fillArrow(QPainter& painter, int p1x, int p1y, int p2x, int p2y, int p3x, int p3y) {

         QPointArray points;

         points.setPoints(3, p1x, p1y, p2x, p2y, p3x, p3y);

         painter.drawPolygon(points);

}

 

最后的效果图如下:

 

 

Qt气泡提示框(自动消失) #ifndef FUNCTION_MESSAGE_WIDGET_H #define FUNCTION_MESSAGE_WIDGET_H #include <QWidget> QT_BEGIN_NAMESPACE class QPaintEvent; QT_END_NAMESPACE class FunctionMessageWidget : public QWidget { Q_OBJECT public: explicit FunctionMessageWidget(Q. 阅读详情

相关推荐

Qt实现气泡消息 C/C++

在构造函数中,我们创建了一个QWidget作为中央部件,并将其设置为主窗口的中央部件。通过创建自定义的小部件和绘制技术,我们能够在Qt应用程序中显示漂亮的气泡消息。在Qt中,我们可以使用自定义的小部件和绘图技术来实现气泡消息的效果。当按钮被点击时,一个气泡消息将出现在主窗口的指定位置,并显示相应的文本。在主函数中,我们创建了一个QApplication对象,并创建了一个MainWindow对象并显示它。为了运行以上代码,我们需要在Qt项目中添加相应的源文件,并在主函数中创建一个。槽函数中,我们创建了一个。

PixelBlade的博客 659

qt弹出框自动消失的悬浮提示框_Qt实现冒泡提示框 - osc_1m04dwae的个人空间 - OSCHINA - 中文开源技术交流社区...

#include "TTipWidget.h"TTipWidget::TTipWidget(): mpParent(nullptr), mbEnter(false), mnTransparent(200){setWindowFlags(Qt::Tool| Qt::FramelessWindowHint |Qt::WindowStaysOnTopHint);setAlignment(Qt::Alig...

weixin_42514288的博客 505

【QT开发】对话框控件QDialog类详解及实战应用

QDialog 是 Qt 提供的一个功能强大且灵活的对话框控件,通过本篇文章的学习,你应该对 QDialog 有了全面的理解,能够在自己的项目中正确使用它。对话框在用户界面中帮助你更好地管理和处理用户输入、消息显示等交互,有助于创建用户友好和高效的界面。

科技改变人类,技术成就未来 3202

QT实现蓝色提示气泡绘制、显隐时机、移动、方向切换等功能

蓝色提示气泡上附有提示信息和一个可以点击的按钮,目的是为了引导或提示用户如何操作。文章实现了气泡的绘制,方向切换,显示时机,跟随父窗体移动等功能

不午休の野猫 3110

QT实现提示右下角冒泡效果

主要为大家详细介绍了QT实现提示右下角冒泡效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

别再只跑recon-all了!FreeSurfer实战:从T1图像到freeview可视化的完整避坑指南

本文详细解析FreeSurfer从T1图像处理到freeview可视化的全流程,包括环境配置、recon-all深度解析、高级可视化技巧及性能优化策略。特别针对常见错误提供解决方案,帮助用户高效完成MRI数据分析,避免常见陷阱。

weixin_33404102的博客 353

Qt 气泡弹窗(气泡、气泡Widget)

空的气泡控件Qt5.12.7。

weixin_42661551的博客 1580

FactoryTool量产神器实战:5分钟搞定多块RK3568板卡并行烧录

本文详细介绍了使用瑞芯微FactoryTool对多块RK3568板卡进行高效并行烧录的实战指南。文章从硬件连接、驱动配置、软件操作到排错技巧,提供了一套完整的量产解决方案,重点阐述了如何利用该工具在5分钟内完成多设备固件烧录,并确保eMMC存储的写入稳定性与效率,大幅提升生产线吞吐量。

b0c1d2的博客 987

C++:QT实现自定义提示框

QT自定义提示框

学习新知识,争做新青年 975

ROS2 Jazzy 学习路线图(2026最新)

摘要: ROS2 Jazzy(LTS版)是2026年长期支持版本,仅适配Ubuntu 24.04。本文提供WSL环境下的学习路线图: 环境搭建(1-2天):配置WSL2+Ubuntu 24.04,安装ROS2 Jazzy及图形工具(VcXsrv、VS Code)。 核心概念(3-5天):掌握节点、话题、服务等通信机制,使用turtlesim和小海龟仿真实践。 开发实战(7-10天):Python/C++节点开发,结合RViz2、Gazebo等工具完成多节点通信和避障项目。 进阶应用(10-15天):导航(N

zheng_ruiguo的专栏 636

你不必懂AI,但必须会用AI:写给所有焦虑中的职场人

AI时代不必焦虑学技术,关键在于用AI解决实际问题。文章指出,99%的人只需成为AI使用者而非建造者,核心竞争力在于结合业务痛点运用AI工具提升效率。与其盲目学习工具,不如梳理工作流程,识别可优化环节,让AI赋能重复性、标准化任务。行业经验与AI工具的结合才是真正的职场护城河。建议从具体工作场景出发,寻找匹配的AI解决方案,迈出应用第一步。

hundred98的博客 716

Qt 自定义提示框 右下角冒泡

网页右下角上经常会出现一些提示性的信息,B/S有的东西,C/S当然也可以有,就像QQ的消息提示一样!实现一个类似的东西并不困难,只要想明白原理实现起来就很简单了!实现原理: (1)显示:右下角缓慢弹出,定时器启动,逐渐改变位置即可,到达相应位置,停止计时器。(2)驻留:定时器启动,让界面停留一定的时间,相应的时间过后停止定时器。(3)退出:可以直接退出,也可以采用改变透明度的形式模糊退出。

FightingOning的博客 1478

esp32c6 开发实战:低功耗蓝牙(BLE)开发

蓝牙栈在此程序流程中已经启动并运行,但是应用程序的功能尚未定义。功能的定义是通过响应事件来实现的,当其他设备尝试读取或写入参数以及建立连接时就会触发事件回调函数处理。BT控制器在控制器端实现主机控制器接口(HCI),链路层(LL)和物理层(PHY)。BT控制器对用户应用程序不可见,并处理BLE堆栈的较低层。蓝牙堆栈(Bluedroid stack)定义了经典蓝牙(BT Classic)和低功耗蓝牙(BLE)的通用定义和API。的判断)等对于启动低功耗蓝牙来说不重要的代码,函数初始化和启用BT控制器。

月入鱼饵的博客 2740

QT自定义的气泡类型提示框

由于项目需要,自定义了一个QT气泡显示的控件,参照了一部分网上的代码,自己也修改了许多,可支持四个不同的方向。不多说,上图: 代码如下: const int SHADOW_WIDTH = 15; // 窗口阴影宽度; const int TRIANGLE_WIDTH = 15; // 小三角的宽度; ...

Mario_z的博客 9456

CE电流法测试中的dBμV负值解析

传导发射(CE)电流法测试中出现的dBμV负值现象表明被测设备干扰电平低于1μV参考基准。这源于对数计算特性(小于1μV的电压转换后为负值)、设备优良的EMC设计(如滤波效果显著)及测试环境的影响(LISN隔离、屏蔽室低噪声)。负值虽不代表实际负电压,但反映干扰水平优于标准限值,为系统集成预留电磁裕度。工程应用中需结合设备灵敏度、环境背景噪声等因素综合分析,避免误判,这类数据可用于评估EMI设计冗余度。

硬核科技 298

Oracle数据库表空间使用情况查询

在Oracle数据库中,表空间(Tablespace)是用于存储表、索引和其他数据库对象的逻辑存储单元。了解表空间的使用情况对于数据库管理员和开发人员来说是非常重要的,因为它可以帮助他们监控数据库的空间使用情况并进行容量规划。本文将介绍如何查询Oracle数据库中的表空间使用情况。通过执行以上SQL查询语句,你可以获得Oracle数据库中表空间的使用情况、文件大小和表空间大小等信息。这些信息可以帮助你了解数据库的存储情况,并进行适当的优化和容量规划。查看表空间的数据文件和表空间大小。查看表空间的使用情况。

CsmbPascal的博客 857

qt弹出框自动消失的悬浮提示框_Qt气泡提示框(自动消失)

#ifndef FUNCTION_MESSAGE_WIDGET_H#define FUNCTION_MESSAGE_WIDGET_H#include QT_BEGIN_NAMESPACEclass QPaintEvent;QT_END_NAMESPACEclass FunctionMessageWidget : public QWidget{Q_OBJECTpublic:explicit Func...

weixin_31408789的博客 1444

2.Vivado软件基础操作

在本章节,我们以一个简单的计数器实例,介绍FPGA开发软件Vivado的基础操作流程,计数器实例程序的设计,在本课程中先不同掌握,后续课程将针对verilog编程进行讲解。 打开Vivado软件,会看到如下的界面: 点击如下图所示的: 点击Next> 将这个地方,设置路径,注意路径必须是英文路径。且文件夹名称第一个字符不能为数字。所有路径的名称的字符数量不能超过144个符号。 点击Next> 点击Next> 点...

FPGA/MATLAB学习教程/源码/项目合作开发 4478

Qt实现冒泡提示框

通过QLabel创建类似冒泡方式的提示框(提示框显示位置为父类控件居中位置,具体可根据需要自行修改),鼠标停留提示框界面时查看信息,离开时自动淡化消失的效果; 头文件定义 #ifndef _TTipWidget_H_ #define _TTipWidget_H_ class TTipWidget :public QLabel { Q_OBJECT public: ...

weixin_30502157的博客 792

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Qt 自定义的气泡类型提示窗口

气泡弹窗

qq_40285036的博客 4092

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

QT各提示框使用

弹框使用一,使用默认按钮 OK1,警告提示框2,错误提示框3,information提示框4,question提示框5,about提示框二,自定义弹出框按钮三,自定义弹框点击按钮后的操作四,按钮类型 弹框主要是发布软件后用于提示用户软件运行情况,需要用户手动确认后,程序才会继续执行下一步操作。 一,使用默认按钮 OK 1,警告提示框 QMessageBox::warning(this,tr("警告信息"),tr("用户确认警告信息")); 2,错误提示框 QMessageBox::critical(thi

平凡的人,平凡的路,平凡的人生 1万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Qt消息提醒框

MessageDialogMessageDialog可以在用户操作时,给出一个提示性信息。相关的使用示例如下: MessageDialog{ title: "Message Dialog" icon: Standard...

IEE2285的博客 2343

QT 提示框

int ret = QMessageBox::question(this, "退出程序", "您是否确认退出\r\n"); if(ret == QMessageBox::StandardButton::Yes){ }else{ } eg: information QMessageBox::information(NULL, "Title", "Content",

时越的博客 1008

Qt控件大致介绍以及Qt的窗口提示集合

控件 在这简单介绍几个常用的控件,初步了解(肥肠的重要),深入请跟着我一起往后看。 1.1 按钮组(Buttons) 按钮组包括的按钮有: Push Button: 按钮 Tool Button: 工具按钮 Radio Button: 单选按钮 Check Box: 复选框 Command Link Button: 命令链接按钮 Dialog Button Box: 对话框按钮盒 下面以QPushButton举例介绍一下按钮的用法。 #include<PushBut

weixin_42753827的博客 3213

QTopia2.1触摸屏输入法的制作

英文输入法界面效果图 中文输入法界面效果图  1 界面布局关键:留意管理器QGridLayout类的使用!  ---主界面的布局GeoImDialog::GeoImDialog(QWidget *parent, const char *na

飞羽飞の猪の博客 9911
上一篇: 简单的学生管理系统
下一篇: 十年学会编程
飞羽飞之猪
博客等级 码龄21年 127粉丝 85原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值