qt2-无边框窗口创建、拖拽、阴影
文章目录
- 创建 widget 工程
- main.cpp
- 设置无边框窗口
- 窗口的拖拽
- 窗口移动总结反思
- 阴影效果
- 关于ui的一点思考
创建 widget 工程
注意这里选择 QWidget 基类即可。
- 类名:Widget
- 基类:QWidget
- 头文件:widget.h
- 源文件:widget.h
- 创建界面
- 界面文件:widget.ui
- pro文件:firstLessonReview
- 主函数:main.cpp
main.cpp
- 第 6 行创建一个 QApplication 的对象,用于管理应用程序,接收两个命令行参数。
- 第 7 行创建一个 Widget 的对象,该对象实际运行时弹出来的部件窗口
- 第 8 行让该 widget 对象显示,因为qt 默认新建的可视化部件都是不显示的
- 第 10 行,让 QApplication 对象跑起来,进入事件轮询,这样在发生事件的时候可以进行响应
设置无边框窗口
- 运行程序,观察运行结果如下
2. 进入widget.cpp
文件,添加this->setWindowFlags(Qt::FramelessWindowHint);
2.1 在 setWindowFlags
上右键选择 Follow symbol under cursor
2.2 观察到:该函数只有一个参数,在 Qt::WindowFlags 继续右键 follow
2.3 随后,继续follow WindowType
2.4 观察到, WindowType 是一个 enum 变量,从中选择FramelessWindowHint
,写入 setWindowFlags()
函数中
3. 运行程序,结果如下
窗口的拖拽
通常情况下,对于一个程序的拖拽,我们都是左键按住窗口的上边栏进行拖拽,在这里,我们实现在窗口任意位置按住左键拖拽的功能。
- 数学关系 y = x+z
白色背景作为桌面,黑色方框作为程序窗口,箭头是鼠标左键按下的位置,y 是桌面左上角对于鼠标左键的位置,x是窗口左上角对于桌面左上角的位置,z 是鼠标左键对于窗口左上角的位置,存在向量关系 y = x + z或者是直角坐标系中,y的坐标也是x的坐标与z的坐标之和。 - 鼠标的动作为 按下(press)、移动(即拖拽 move)释放(release),对于qt而言,这些都是事件(event),且是在widget下的事件,在帮助菜单的索引中搜索
mousepress
2.1 双击mousePressEvent
,在弹出的窗口中选择QWidget Class | Qt Widgets 5.12
2.2 上拉至顶部,观察到这是QWidget Class
,打开其中的Protected Functions
,在其中找到我们需要的函数
2.3 复制它们到 widget.h 中,进行函数声明,并在widget.cpp
中具体实现
2.4 由于要对点进行操作,故在widget.h
中包含头文件QPoint
,同时又因为对鼠标进行事件操作(mouse event),故在widget.h
中包含QMouseEvent
2.4.1 y 的位置获取
y 是 鼠标按下事件发生时的点相对于桌面(global)的位置(pos)。故应该是 mouseEvent的位置
QPoint y = event->globalPos();
2.4.2 x 的位置获取
x 是整个widget窗口(this)相对于桌面(global)的位置
QPoint x = this->geometry().topLeft();
2.4.3 z 的位置
应用 y = x + z;QPoint z = y -x;
2.5 当获取到x,y,z 的位置后,进行移动窗口(move geometry)
在移动窗口时候,y是个变值,x是个变直,z是个定值(在mousePressEvent中获取得到,需要在 mouseMoveEvent中使用,故改变 z 为类的私有变量
2.5.1 在 widget.h z 中定义私有变量 z
2.5.2 在 widget.cpp 中使用私有z
2.5.3 在 mouseMoveEvent函数中实现 x,y,z
y 的值时变值,需要时刻读取,z 是固定值,x是变值 ,x = y - z;
2.5.4 移动窗口
移动(move)的是窗口(即部件widget),且移动的位置可以由x决定,即 窗口的移动跟随鼠标的移动(随动系统,x鼠标移动是输入,y窗口移动是输出,符合逻辑,反过来不成立)
this->move(x);
2.6 鼠标释放
直接将 z 的值清空即可,调用 QPoint 即可
2.7 运行程序,按下鼠标左键移动窗口
窗口移动总结反思
- 窗口的移动,应当是跟随着鼠标的移动而移动,逻辑顺序不能反。
- 对于 z,是一个固定值,只需要在最开始的时候确定下来,可以认为是一个const变量,故可作为私有成员;但是 y 不可以作为私有成员。该变量如果作为私有成员在press的时候固定下来,那么在move中,就无法改变该值,并且y应当是move中,每移动一次就需要改变的量。
- 最重要的是,y 是鼠标左键对于桌面左上角的位置值,它的变动,引起窗口的变动。
阴影效果
- 在 ui界面中拖入一个新的widget,命名为 shadowWidget(两个箭头处任意改变其中一个即可)
- 将shadowWidget 改变为其他颜色,便于区分
- 对图片添加阴影效果(graphics drop shadow)
在帮助文档搜索dropshadow
,双击进入第一箭头处,发现不是我们要找的,进入第二个箭头处
3.1 点击箭头指向的more...
3.2 根据解释,我们找到需要的三个函数
- 在 widget.cpp 中添加头文件
#include <QGraphicsDropShadowEffect>
- 创建指针对象,分配空间
- 调用刚刚获得的三个函数
- 设置
shadowWidget
的阴影效果
7.1 在最开始创建界面的时候,在widget.h中,就同时生成了一个Ui::Widget *ui;
的指针,我们可以直接利用
7.2 在 widget.cpp中设置阴影
- 运行,查看效果
9. 利用设置 widget 的属性,可以隐藏主 widget
关于ui的一点思考
- ui也是一个对象,只是这个对象是可视化的
- 在ui上进行可视化操作,利用纯程序代码应该也可以完成这个操作。
- 在ui上进行的可视化操作,本质上应该还是 对象的实例化,对象的函数调用等
qt2-无边框窗口创建、拖拽、阴影相关推荐
- QT-lesson1-无边框窗口创建/拖拽/阴影-20190322
文章目录 创建 Qt Widgets Application Location Kits Details 汇总 ui 操作 运行 添加图标 下载 icon 放在程序主目录中 pro文件 release ...
- python小技巧大应用--基础实用漂亮界面(无边框,圆角,可拖拽)
这回要实现一个漂亮的基础界面,要具有如下特色: 无边框,圆角,漂亮的背景,可拖拽移动,具有最小化,关闭按钮,界面与代码分离,支持qss 先展示一下最后的效果: 那就开始工作吧: 1.通过Qt Desi ...
- 通过调用API函数实现的无边框窗体的拖拽,比判断坐标更快捷
在winform程序中,有时会选择边框设计会none,但是这样就不能拖拽窗体移动 解决方案有二: 1,判断坐标控制拖拽 2.利用API函数, 下面介绍利用API函数,方便,快捷 #region 移动无 ...
- Electron无边框窗口(最小化、最大化、关闭、拖动)以及动态改变窗口大小
文章目录 一.目标原型 1. 目标 2. 原型设计 3. 原型初步实现 二.无边框窗口 1. 要点 2. 改造 三.可拖拽区 1. 要点 2. 改造 四.最小化.最大化.关闭 1. 要点 2. 改造 ...
- JQuery Dialog(JS模态窗口,可拖拽的DIV)
JQuery Dialog(JS模态窗口,可拖拽的DIV) 吴剑 2012-08-08 原创文章,转载必需注明出处:http://www.cnblogs.com/wu-jian/ 效果图 调用示意图 ...
- MFC中窗口实现拖拽文件功能
MFC窗口拖拽文件功能指的是用鼠标将文件拖拽入窗口后,在窗口中可以获取拖拽文件的绝对路径,如图1所示. 图1 文件拖拽功能 实现窗口的拖拽文件功能,首先要将窗口注册为放置拖拽文件的目标,之后在窗口中响 ...
- Qt Quick无边框窗口
开发环境:Qt Creator 5.6 内容: 使用 Qt Quick创建无边框窗口 Qt Quick是一个无比强大.无比方便快捷的跨平台的开发框架,并且能通过Qt强大的元对象系统实现qml与c+ ...
- 【C++·Qt】Qt透明无边框窗口以及拖动
窗口透明 1.窗口整体透明(包含其子空控件) //窗口以及子控件都透明 //setAttribute(Qt::WA_WState_WindowOpacitySet); //网上说直接设置不起作用,需 ...
- QT实现可移动和改变尺寸的无边框窗口
2019独角兽企业重金招聘Python工程师标准>>> 实现QT无边框窗口的拖动,尺寸改变.需要的时候从该类继承,派生类需要定义为QWidget. 头文件: #ifndef SIZE ...
最新文章
- 《LeetCode力扣练习》第20题 有效的括号 Java
- highcharts学习1----Line charts
- Android之GridView(九宫图)
- docker容器内没有yum命令_为什么不建议把数据库部署在Docker容器内?
- html天猫倒计时代码,怎么用JavaScript编写一个天猫上使用的倒计时?
- 了解MyBatis框架
- # Mysql免登录重置root密码
- (8)数据结构-循环队列
- Ubuntu 安装gcc/g++
- python二维码批量拼接,多张高清二维码批量拼接
- C#学习笔记五——选择文件、文件夹操作
- DRM in Android详解
- emacs快捷键总结
- 微信小程序获取头像和昵称,头像圆角设置
- 模拟电路实验 03 - | 负反馈放大电路
- 机器学习中的无监督学习是什么?
- webman apidoc安装、生成接口文档
- 谈谈内卷、IT行业怎么避免内卷?
- java数组转换为集合
- Unity3d快捷键