文章目录

  • 创建 widget 工程
  • main.cpp
  • 设置无边框窗口
  • 窗口的拖拽
  • 窗口移动总结反思
  • 阴影效果
    • 关于ui的一点思考

创建 widget 工程

注意这里选择 QWidget 基类即可。

  1. 类名:Widget
  2. 基类:QWidget
  3. 头文件:widget.h
  4. 源文件:widget.h
  5. 创建界面
  6. 界面文件:widget.ui
  7. pro文件:firstLessonReview
  8. 主函数:main.cpp

main.cpp

  1. 第 6 行创建一个 QApplication 的对象,用于管理应用程序,接收两个命令行参数。
  2. 第 7 行创建一个 Widget 的对象,该对象实际运行时弹出来的部件窗口
  3. 第 8 行让该 widget 对象显示,因为qt 默认新建的可视化部件都是不显示的
  4. 第 10 行,让 QApplication 对象跑起来,进入事件轮询,这样在发生事件的时候可以进行响应

设置无边框窗口

  1. 运行程序,观察运行结果如下


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. 运行程序,结果如下

窗口的拖拽

通常情况下,对于一个程序的拖拽,我们都是左键按住窗口的上边栏进行拖拽,在这里,我们实现在窗口任意位置按住左键拖拽的功能。

  1. 数学关系 y = x+z

    白色背景作为桌面,黑色方框作为程序窗口,箭头是鼠标左键按下的位置,y 是桌面左上角对于鼠标左键的位置,x是窗口左上角对于桌面左上角的位置,z 是鼠标左键对于窗口左上角的位置,存在向量关系 y = x + z或者是直角坐标系中,y的坐标也是x的坐标与z的坐标之和。
  2. 鼠标的动作为 按下(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 运行程序,按下鼠标左键移动窗口

窗口移动总结反思

  1. 窗口的移动,应当是跟随着鼠标的移动而移动,逻辑顺序不能反。
  2. 对于 z,是一个固定值,只需要在最开始的时候确定下来,可以认为是一个const变量,故可作为私有成员;但是 y 不可以作为私有成员。该变量如果作为私有成员在press的时候固定下来,那么在move中,就无法改变该值,并且y应当是move中,每移动一次就需要改变的量。
  3. 最重要的是,y 是鼠标左键对于桌面左上角的位置值,它的变动,引起窗口的变动。

阴影效果

  1. 在 ui界面中拖入一个新的widget,命名为 shadowWidget(两个箭头处任意改变其中一个即可)
  2. 将shadowWidget 改变为其他颜色,便于区分




  3. 对图片添加阴影效果(graphics drop shadow)
    在帮助文档搜索dropshadow,双击进入第一箭头处,发现不是我们要找的,进入第二个箭头处

    3.1 点击箭头指向的 more...

    3.2 根据解释,我们找到需要的三个函数
  4. 在 widget.cpp 中添加头文件 #include <QGraphicsDropShadowEffect>
  5. 创建指针对象,分配空间
  6. 调用刚刚获得的三个函数
  7. 设置shadowWidget的阴影效果
    7.1 在最开始创建界面的时候,在widget.h中,就同时生成了一个 Ui::Widget *ui;的指针,我们可以直接利用

    7.2 在 widget.cpp中设置阴影
  8. 运行,查看效果


9. 利用设置 widget 的属性,可以隐藏主 widget

关于ui的一点思考

  1. ui也是一个对象,只是这个对象是可视化的
  2. 在ui上进行可视化操作,利用纯程序代码应该也可以完成这个操作。
  3. 在ui上进行的可视化操作,本质上应该还是 对象的实例化,对象的函数调用等

qt2-无边框窗口创建、拖拽、阴影相关推荐

  1. QT-lesson1-无边框窗口创建/拖拽/阴影-20190322

    文章目录 创建 Qt Widgets Application Location Kits Details 汇总 ui 操作 运行 添加图标 下载 icon 放在程序主目录中 pro文件 release ...

  2. python小技巧大应用--基础实用漂亮界面(无边框,圆角,可拖拽)

    这回要实现一个漂亮的基础界面,要具有如下特色: 无边框,圆角,漂亮的背景,可拖拽移动,具有最小化,关闭按钮,界面与代码分离,支持qss 先展示一下最后的效果: 那就开始工作吧: 1.通过Qt Desi ...

  3. 通过调用API函数实现的无边框窗体的拖拽,比判断坐标更快捷

    在winform程序中,有时会选择边框设计会none,但是这样就不能拖拽窗体移动 解决方案有二: 1,判断坐标控制拖拽 2.利用API函数, 下面介绍利用API函数,方便,快捷 #region 移动无 ...

  4. Electron无边框窗口(最小化、最大化、关闭、拖动)以及动态改变窗口大小

    文章目录 一.目标原型 1. 目标 2. 原型设计 3. 原型初步实现 二.无边框窗口 1. 要点 2. 改造 三.可拖拽区 1. 要点 2. 改造 四.最小化.最大化.关闭 1. 要点 2. 改造 ...

  5. JQuery Dialog(JS模态窗口,可拖拽的DIV)

    JQuery Dialog(JS模态窗口,可拖拽的DIV) 吴剑 2012-08-08 原创文章,转载必需注明出处:http://www.cnblogs.com/wu-jian/ 效果图 调用示意图 ...

  6. MFC中窗口实现拖拽文件功能

    MFC窗口拖拽文件功能指的是用鼠标将文件拖拽入窗口后,在窗口中可以获取拖拽文件的绝对路径,如图1所示. 图1 文件拖拽功能 实现窗口的拖拽文件功能,首先要将窗口注册为放置拖拽文件的目标,之后在窗口中响 ...

  7. Qt Quick无边框窗口

    开发环境:Qt Creator 5.6 内容:  使用 Qt  Quick创建无边框窗口 Qt Quick是一个无比强大.无比方便快捷的跨平台的开发框架,并且能通过Qt强大的元对象系统实现qml与c+ ...

  8. 【C++·Qt】Qt透明无边框窗口以及拖动

    窗口透明  1.窗口整体透明(包含其子空控件) //窗口以及子控件都透明 //setAttribute(Qt::WA_WState_WindowOpacitySet); //网上说直接设置不起作用,需 ...

  9. QT实现可移动和改变尺寸的无边框窗口

    2019独角兽企业重金招聘Python工程师标准>>> 实现QT无边框窗口的拖动,尺寸改变.需要的时候从该类继承,派生类需要定义为QWidget. 头文件: #ifndef SIZE ...

最新文章

  1. 《LeetCode力扣练习》第20题 有效的括号 Java
  2. highcharts学习1----Line charts
  3. Android之GridView(九宫图)
  4. docker容器内没有yum命令_为什么不建议把数据库部署在Docker容器内?
  5. html天猫倒计时代码,怎么用JavaScript编写一个天猫上使用的倒计时?
  6. 了解MyBatis框架
  7. # Mysql免登录重置root密码
  8. (8)数据结构-循环队列
  9. Ubuntu 安装gcc/g++
  10. python二维码批量拼接,多张高清二维码批量拼接
  11. C#学习笔记五——选择文件、文件夹操作
  12. DRM in Android详解
  13. emacs快捷键总结
  14. 微信小程序获取头像和昵称,头像圆角设置
  15. 模拟电路实验 03 - | 负反馈放大电路
  16. 机器学习中的无监督学习是什么?
  17. webman apidoc安装、生成接口文档
  18. 谈谈内卷、IT行业怎么避免内卷?
  19. java数组转换为集合
  20. Unity3d快捷键

热门文章

  1. jquery-ui寺
  2. java实现权重随机算法
  3. 【按位dp】文盲的学习方法
  4. java特性,健壮性,程序设计风格及文档
  5. 生产环境Nginx配置文件
  6. teched2006会议资料
  7. Libreoffice实现office转pdf、html、jpg等格式数据
  8. 数据抽取工具比对:Kettle、Datax、Sqoop、StreamSets
  9. 如何在Mac上安装Node.js和NPM
  10. 安装Debian-9(Stretch)服务器图文教程