Widget 和 窗口

Qt中,没有Parent 的 Wiget(QWidget 及其子类) 会自动成为一个窗口,如果一个QButton 没有parent,同样会成为一个窗口:

窗口是由操作系统统一管理的,所谓窗口是指:可以接受 鼠标、键盘 、其他外设 触发事件的对象,这些窗口对象由操作系统调度和管理(Qt 会对窗口管理器WM做一次封装)。

窗口一般有title、winid、最大化、最小化、关闭等等默认属性,这些都是为了方便操作系统管理。

自绘 Widget

所有 Widget 都可以自绘其内容,但是无法绘制窗口默认属性,比如最大化按键、最小化按键、关闭按键等等,这些是操作系统 Native 样式,Qt 只是在 WM 上做封装,没法修改 WM 的东西。但是我们可以隐藏 窗口边框 和 窗口默认按键,同时我们又能够接收到所有来自 WM 发来的窗口事件,这样便可以自绘制按键,然后把相应的窗口事件和自己绘制的按键绑定来模拟 Native 窗口按键。

由于不能改变窗口的 Native 内容,因此针对 Widget 的自绘只会发生在窗体边框内部(如果没有隐藏边框的话)。

比如下面的自绘:

CustomWidegt:

void CustomWidget::paintEvent(QPaintEvent *)
{QPainter painter(this);QRect r1 = rect().adjusted(10,10,-10,-10);painter.setPen(QColor("#33B5E5"));painter.drawRect(r1);QRect r2(QPoint(0,0),QSize(40,40));if(m_lastPos.isNull()) {r2.moveCenter(r1.center());} else {r2.moveCenter(m_lastPos);}painter.fillRect(r2, QColor("#FFBB33"));
}void CustomWidget::mousePressEvent(QMouseEvent *event)
{m_lastPos = event->pos();update();
}void CustomWidget::mouseMoveEvent(QMouseEvent *event)
{m_lastPos = event->pos();update();
}

如果不直观,那么嵌套Widget 就比较直观了:

QWindow:

Widget 体系是 Qt 4 的核心,在Qt 5之前,Qt通过Wiget 与 窗口管理器(WM)交互,随着Qt 5 中 Qt Quick的引入, 需要一个新的体系来位置 Qt 与 窗口管理系的关系,QWindow 便肩负了这一重任。

QWindow 和 QWidget 在特性和使用上基本上没什么区别,但是底层实现和渲染机制存在很大差异,不过我们也不太会关心那些内容,不过 Qt Quick Control 必须以 QWindow 作为窗体容器,不能把 Qt Quick Control 和 QWidget 混用,也用不起来。

其他:

有关窗口管理、图形界面原理:

[其他] X11 Qt 窗口管理_ykun089的博客-CSDN博客[GUI] Linux中的图形管理 - yonpenghan - 博客园[GUI] QT事件与X11的关系 - yongpenghan - 博客园https://blog.csdn.net/ykun089/article/details/120656887

[Qt] QWidget QWindow 窗口管理器(WM)相关推荐

  1. Qt qwidget嵌入ppt

    1. pro :  增加  QT+=axcontainer 2.打开ppt QAxObject *ppt_dsoframer;ppt_dsoframer=new QAxObject(this);boo ...

  2. Qt QWidget实现消息提示控件TipsWidget

    前言 用Qt实现一个消息提示控件,控件宽度会根据显示的内容多少来动态伸展,控件显示三秒钟过后会自动渐变透明度然后最终消失,这有点类似于Android的Toast控件,都是用于消息短暂提示. 源码 头文 ...

  3. Qt QWidget实现开关控件SwithButton(SlipButton)

    前言 Qt做界面的时候常常会用到开关控件,类似于CheckButton有两种状态,只是界面表现形式不一样而已.本文通过QWidget类来实现一个开关控件SwitchBtn(有些平台上又称为SlipBu ...

  4. Qt QWidget实现手势缩放和平移(二)

    上一篇文章中讲到了QWidget实现手势缩放和平移,通过QGestureEvent来捕捉手势操作,但是这种方式不一定能通用,比如像教学用的电子白板上,是红外触控感应,并不能通过QGestureEven ...

  5. Qt QWidget实现手势缩放和平移(一)

    由于项目要求,需要在QWidget中实现一个手势操作的功能,对图片进行放大/缩小/平移功能,并且还需要支持通过鼠标和键盘来实现该功能.其实这种功能在QGraphicsView中实现比较简单, 不过在Q ...

  6. Qt QWidget播放视频背景图片闪烁

    播放软件主窗口重新实现函数changeEvent,解决最小化之后界面不刷新问题. void VRS::changeEvent(QEvent * event) {//最小化之后再恢复到之前状态,界面会出 ...

  7. Qt: QWidget::paintEngine: Should no longer be called

    目录 由来 注意下面我的创建过程: 下面是解决方法: 产生这个错误的原因: 由来 今天在QT Creater使用QPainter的时候出现了这个错误,在引用输出窗口还有这么一些错误 之前在使用其他类的 ...

  8. Qt QWidget控件透明动画实现

    QWidget控件透明动画实现 要做子控件透明需要用到QGraphicsOpacityEffect类 使用方法: QGraphicsOpacityEffect * m_pGraphicsOpacity ...

  9. Qt / QWidget、QFrame 区别

    QFrame 是基本控件的基类,QWidget 是 QFrame 基类,关系如下: QWidget <- QFrame <- QPushButton,QLabel- 我们经常会从 QFra ...

最新文章

  1. 爱送礼成中国好前任,谢谢你让我认识了快递员
  2. PAT甲级1099 Build A Binary Search Tree (30分):[C++题解]建立二叉搜索树、dfs和bfs
  3. C语言实现循环链表Circularly Linked List(附完整源码)
  4. ASP.NET Core微服务(六)——【redis操作】
  5. 垃圾收集 java_关于Java垃圾收集
  6. 嵌入式常见笔试题总结(2)
  7. 数智德州,创新未来 | 智慧城市赛题上线山东大赛德州分赛场
  8. c语言程序设计题库 微盘下载,《C语言程序设计》题库及答案.pdf
  9. IEEE论文模板下载地址及说明
  10. 新能源行业SCM供应链管理平台构建一站式新能源供应链交易闭环
  11. 2015年蓝桥杯A组C/C++ 第三题奇妙的数字
  12. HTML中背景图片如何自适应屏幕
  13. 新消费业内人说不出口的10个问题
  14. 60个未来的新兴服务业最红火
  15. React Native学习笔记(二)---运行开源App,形成直观感受
  16. 《Python编程入门到实践》 第四章 操作列表
  17. 解决arcgis地图选中的时候有白色边框的问题
  18. 第四届中国(广东)国际“互联网+”博览会今日在佛山开幕 聚集工业“智慧”推动产业加速转型...
  19. python进阶——AI视觉实现口罩检测实时语音报警系统
  20. 2019-CS224N-Assignment 1: Exploring Word Vectors

热门文章

  1. ini文件全部写入时换行符号未写入的问题处理
  2. 1、标杆对照 《数据收集工具与技术》
  3. shell实现除法计算器
  4. C函数库(libc、glibc、uClibc、newlib)
  5. 二.MUI框架 开始体验MUI
  6. vue-pdf使用+分页预览(踩坑 + 使用本地字体库)
  7. 虚拟机 Centos8 服务器密码忘了
  8. 【计算几何】atan2函数
  9. 基于稳定隶属度的自调优多峰聚类算法(SMMP)(SMMP)(Matlab代码实现)
  10. oracle数据库的blob和clob类型,是什么意思和区别