当前位置: 首页 > 编程日记 > 正文

QWidget一生,从创建到销毁事件流

版权声明:若无来源注明,Techie亮博客文章均为原创。 转载请以链接形式标明本文标题和地址:
本文标题:QWidget一生,从创建到销毁事件流     本文地址:http://techieliang.com/2017/11/319/
代码较多,此处显示效果不佳,建议到原文地址查看

最近做UI,有多个窗口嵌套,且所有窗口均用了Layout布局,当运行程序时,主窗口布局有效,而嵌套的窗口布局未生效。

1. 构造函数Resize()

首先我想到的是,我设置了Layout,那么他会自动调整大小,是不是在创建子窗口的时候并没有获取到此窗口在父类布局中占用的位置?那么我在构造的时候分别设置每个子窗口即可。

child_widget->Resize(this->XXXX->size());//XXXX是子窗口一个widget的区域,或者qstackedwidget等某个页面的大小

使用上述类似的指令去重新设置,发现没有任何效果。而根本原因是构造函数中获得的Size()并不对,不是主窗口的真实尺寸。

2. 笨方法-QTimer()

由于时间关系,使用了笨方法。无论如何最后构造完成以后肯定窗口显示了。。。。

那么建立一个定时器,构造的时候启动定时器,连接到槽,然后timeout()以后执行Resize指令,并且stop Timer。。。

此方法确实解决了布局适应的问题,但是建立一个timer,方法并不友好

3. QWidget构造到销毁事件流分析

此处为了方便,不对QWidget做范例分析,直接用QMainWindow做分析,QMainWindow是QWidget的子类。

下面会详细说明分析方法,若需要对QWidget或者其他控件做分析,可以仿照进行。

3.1. 实验项目配置

直接新建一个Qt Widgets项目,为了测试方便,我把默认的菜单栏、工具栏、状态栏都取消了,只添加了一个QPushButton按钮控件。

程序代码如下:

*.pro

  1. QT += core gui
  2. greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
  3. TARGET = untitled
  4. TEMPLATE = app
  5. DEFINES += QT_DEPRECATED_WARNINGS
  6. SOURCES += \
  7. main.cpp \
  8. mainwindow.cpp
  9. HEADERS += \
  10. mainwindow.h
  11. FORMS += \
  12. mainwindow.ui

mainwindow.ui

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <ui version="4.0">
  3. <class>MainWindow</class>
  4. <widget class="QMainWindow" name="MainWindow">
  5. <property name="geometry">
  6. <rect>
  7. <x>0</x>
  8. <y>0</y>
  9. <width>400</width>
  10. <height>300</height>
  11. </rect>
  12. </property>
  13. <property name="windowTitle">
  14. <string>MainWindow</string>
  15. </property>
  16. <widget class="QWidget" name="centralWidget">
  17. <widget class="QPushButton" name="pushButton">
  18. <property name="geometry">
  19. <rect>
  20. <x>190</x>
  21. <y>150</y>
  22. <width>89</width>
  23. <height>24</height>
  24. </rect>
  25. </property>
  26. <property name="text">
  27. <string>PushButton</string>
  28. </property>
  29. </widget>
  30. </widget>
  31. </widget>
  32. <layoutdefault spacing="6" margin="11"/>
  33. <resources/>
  34. <connections/>
  35. </ui>

main.cpp

  1. #include "mainwindow.h"
  2. #include <QApplication>
  3. int main(int argc, char *argv[]) {
  4. QApplication a(argc, argv);
  5. MainWindow w;
  6. w.show();
  7. return a.exec();
  8. }

mainwindow.h

  1. #pragma once
  2. #include <QMainWindow>
  3. namespace Ui {
  4. class MainWindow;
  5. }
  6. class MainWindow : public QMainWindow {
  7. Q_OBJECT
  8. public:
  9. explicit MainWindow(QWidget *parent = 0);
  10. ~MainWindow();
  11. protected:
  12. bool event(QEvent *event) Q_DECL_OVERRIDE;
  13. private:
  14. Ui::MainWindow *ui;
  15. };

mainwindow.cpp

  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. #include <QEvent>
  4. #include <QDebug>
  5. MainWindow::MainWindow(QWidget *parent) :
  6. QMainWindow(parent),
  7. ui(new Ui::MainWindow) {
  8. qDebug()<<"Befor ui->setupUi(this)";
  9. ui->setupUi(this);
  10. qDebug()<<"After ui->setupUi(this)";
  11. }
  12. MainWindow::~MainWindow() {
  13. delete ui;
  14. }
  15. bool MainWindow::event(QEvent *event) {
  16. qDebug()<<event->type();
  17. QMainWindow::event(event);
  18. }

其实项目很简单,就是直接重写了event(QEvent *event)函数,利用qDebug()输出事件类型。

事件类型通过type调用,返回TYPE枚举类型,此类型在“qcoreevent.h”文件夹存储

  1. enum Type {
  2. None = 0, // invalid event
  3. Timer = 1, // timer event
  4. MouseButtonPress = 2, // mouse button pressed
  5. MouseButtonRelease = 3, // mouse button released
  6. MouseButtonDblClick = 4, // mouse button double click
  7. MouseMove = 5, // mouse move
  8. KeyPress = 6, // key pressed
  9. KeyRelease = 7, // key released
  10. FocusIn = 8, // keyboard focus received
  11. FocusOut = 9, // keyboard focus lost
  12. FocusAboutToChange = 23, // keyboard focus is about to be lost
  13. Enter = 10, // mouse enters widget
  14. Leave = 11, // mouse leaves widget
  15. Paint = 12, // paint widget
  16. Move = 13, // move widget
  17. Resize = 14, // resize widget
  18. Create = 15, // after widget creation
  19. ……………………………………………………………………//太多了,具体自行查看
  20. };

3.2. 结果

直接运行程序就出现了结果,从运行到窗口创建完毕:

同时在main()函数中每个位置增加断点可以看到不同指令的详细执行效果。

  1. Befor ui->setupUi(this)//构造函数开始----MainWindow?w;
  2. QEvent::Type(ChildAdded)
  3. QEvent::Type(WindowTitleChange)
  4. After ui->setupUi(this)//构造函数结束---MainWindow?w结束;
  5. QEvent::Type(PlatformSurface)//---w.show()开始;
  6. QEvent::Type(WinIdChange)
  7. QEvent::Type(WindowIconChange)//icon
  8. QEvent::Type(Polish)//style polish
  9. QEvent::Type(ChildPolished)
  10. QEvent::Type(Move)//调整窗口位置
  11. QEvent::Type(Resize)//调整窗口尺寸
  12. QEvent::Type(Show)//显示
  13. QEvent::Type(CursorChange)
  14. QEvent::Type(ShowToParent)
  15. QEvent::Type(PolishRequest)
  16. QEvent::Type(LayoutRequest)
  17. QEvent::Type(UpdateLater)
  18. QEvent::Type(UpdateRequest)//---w.show()结束
  19. QEvent::Type(WindowActivate)//---a.exec()
  20. QEvent::Type(ActivationChange)
  21. QEvent::Type(Paint)//---a.exec()结束

关闭窗口:

  1. QEvent::Type(NonClientAreaMouseMove)//鼠标移动到关闭
  2. QEvent::Type(NonClientAreaMouseButtonPress)//点击右上角关闭
  3. QEvent::Type(Close)
  4. QEvent::Type(WindowDeactivate)
  5. QEvent::Type(ActivationChange)
  6. QEvent::Type(Hide)
  7. QEvent::Type(HideToParent)
  8. QEvent::Type(UpdateRequest)

3.3. 结果分析

通过构造的事件流可以看到,Qt的设置各个控件的尺寸的操作在构造函数之后,所以在构造函数用Size获取到的尺寸是错误的。

Qt的Event类型有很多,发型不同类型的事件会调用对应的函数,可以看QWidget的API,上述发生事件部分对照关系已经在注释中写出,下面总结一下主要的事件流,出现的先后顺序就是事件发生顺序:

MainWindow?w;

  • 调用构造函数

w.show();

  • QStyle::polish()
  • QWidget::moveEvent()
  • QWidget::resizeEvent()
  • QWidget::showEvent()—–在这里刷新所有嵌入的子页面的size即可实现自适应

a.exec();

  • QWidget::ensurePolished()
  • QWidgetBackingStore::sync()
  • QWidget::paintEvent()

退出:

  • QWidget::closerEvent()

转载于:https://www.cnblogs.com/techiel/p/7932301.html

相关文章:

事物_软件分层

事务 事务是&#xff1a;在数据库指业务处理的”一个业务“对应数据库中的多个步骤的操作。例如银行转账。 面对的问题&#xff1a;程序接受请求后&#xff0c;会至少发送两条SQL语句&#xff0c;两条语句之间会有时间的间隔&#xff0c;如果间隔时间期间Mysql服务器发生意外&a…

雷林鹏分享:jQuery EasyUI 数据网格 - 创建属性网格

jQuery EasyUI 数据网格 - 创建属性网格 属性网格(property grid)带有一个内置的 expand(展开)/collapse(合并) 按钮&#xff0c;可以简单地为行分组。您可以简单地创建一个可编辑属性的分层(hierarchical)列表。 设置 HTML url"propertygrid_data.json" showGroup&q…

as3.0中如何阻止事件冒泡?

as3.0中的事件冒泡机制有时候会很烦人&#xff0c;比如一个Sprite(方便下文描述就命名为Container吧)把另一外Sprite(称为Child吧)做为子元素套进来以后&#xff0c;如果两个Sprite都注册了Mouse_Down事件&#xff0c;要想在Child上点击鼠标时系统只响应Child的Mouse_Down事件&…

紫色回归线:雅虎中国的运筹学

共同体并不意味着一个我们可以获得享受的世界&#xff0c;而是一个我们热切希望栖息、希望重新拥有的世界。—— 齐格蒙特.鲍曼紫色回归线&#xff1a;雅虎中国的运筹学紫色是比较中性的颜色&#xff0c;但紫色在生活中却也是温柔、神秘、甚至性感的代词。当雅虎中国将主色调重…

JavaScript_上

javaScript JavaScript,简称JS&#xff0c;是Web开发中不可缺少的脚本语言的&#xff0c;不需要编译就可以运行&#xff08;解释性语言&#xff09;。它“寄生”在HTML体内&#xff0c;随网络传输到客户端在浏览器中运行。js代码可以写到html的任何地方。一般写在 body 结束标签…

java类加载的表现形式

java中的类是动态加载的&#xff0c;我们先看一下我们常用的类加载方式&#xff0c;先有一个感性的认识&#xff0c;才能进一步 深入讨论,类加载无非就是下面三种方式。 class A{} class B{} class C{} public class Loader{ public static void main(String[] args) throws Ex…

.net core在vs开发环境下脱离iis运行

.net core相比之前.net的是一个可以跨平台&#xff0c;脱离iis运行的语言&#xff0c;并且项目启动的效率要比用iis启动快&#xff0c;可以说进一步提高了开发的效率。要想自己的项目core脱离iis&#xff0c;首先选择vs启动项目的载体&#xff1a; 如下图&#xff0c;不要选择I…

Sublime遇见中文乱码问题?

今天在写demo的时候&#xff0c;突然发现html页面上的中文在浏览器上显示乱码~&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 这时&#xff0c;我根据网上的提示安装了两个插件:converttoUtf-8&#xff0c;support Gbk ~~~然而&#xff0c;好像无济于事~~ 于是…

Dynamics AX 2009 升级PreSynchnoize时的无反应的解决

问题: 安装完升级补丁后在Data upgrade cockpit窗口点击Run或Train Run按钮后Update Job没有开始&#xff0c;始终显示为Ready状态。 #1 原因&#xff1a;数据库以前已经做过升级&#xff08;例如安装过AX 2009 SP1&#xff09;并且已经存在一个DataUpdate批处理组但是针对这个…

如何 搭建 RMAN 备份平台

一&#xff0e; RMAN 的一些理论知识RMAN Catalog 和 Nocatalog 的区别http://blog.csdn.net/tianlesoftware/archive/2010/06/02/5641763.aspxRMAN 系列&#xff08;一&#xff09;---- RMAN 体系结构概述http://blog.csdn.net/tianlesoftware/archive/2010/06/09/5659701.asp…

git更新代码报错,error: The following untracked working tree files would be overwritten by ch

git忽略大小写导致的&#xff0c; git config --add core.ignorecase true 转载于:https://www.cnblogs.com/newcbs/p/10732662.html

JavaScript_下_Dom

Dom对象 Dom对象&#xff1a;Document Object Model 文档对象模型。js是用来操作html的。 一个文档必须被加载到浏览器中&#xff0c;会按照HTML的层级结构转换成一个“家谱树”称为dom树。HTML文档里的所以的标签&#xff0c;属性&#xff0c;文本都会转换成dom树上的节点。 …

HDU 4300 Clairewd’s message

一道KMP的变式 本题仍是求最大前缀后缀&#xff0c;所以仍用KMP&#xff0c;但不同的是&#xff0c;本题有一个密码转换规则&#xff0c;不过好在题目中说了两段不重合&#xff0c;那么我们就可以在中间插入一个特殊符号*&#xff0c;保证求next数组时不会越过中线&#xff0c;…

GNS3模拟VPC注意几点

网上的GNS3入门到精通视频的确做得不错。现我写一下主要几点&#xff1a;1、创建MS lookback 适配器在添加硬件那里&#xff0c;并注意IP设置要在本地网卡同一子网&#xff0c;网关不用设置的。2、GNS3 的Dynamips目录的cygwin1.dll文件替代VPCS目录中文件。3、GNS3中的模拟PC先…

Windows Phone 7 Tip (5) -- App liftcycle

在新的trainning kit 中有一个例子解释的很清楚了&#xff1a; 1. Application_Launching&#xff1a;只有在新启动程序时触发 2. Application_Closing&#xff1a;只有在推出程序时触发--只有在程序mainpage时按硬后退键 3. Application_Activated&#xff1a;从home键或者其它…

npm i和npm install的区别

最近人用npm i来直接安装模块&#xff0c;但是有会报错&#xff0c;用npm install就不会报错&#xff0c;刚开始百思不得其解&#xff0c;它俩明明是同一个东西后来查npm的帮助指令发现还是没区别&#xff0c;npm i仅仅是npm install的简写&#xff1a; 实际使用的区别点主要如…

获取服务器路径的方式 【记录】

JSP页面获取服务器路径的方式 1.basePath方式 <% String path request.getContextPath(); String basePath request.getScheme()"://"request.getServerName()":"request.getServerPort()path"/"; %> 在url加入<%basePath%>如&…

系统安全设置部分项

1.设置合理的操作超时锁定&#xff08;10分钟以内&#xff09;&#xff0c;在恢复时需要重新鉴别。 开启连接超时 vim /etc/ssh/sshd_config ClientAliveInterval 120 //设置超时时间2分钟 ClientAliveCountMax 3 重启 /etc/init.d/sshd restart 2.设置TMOUT将自动在所设置…

简单的分级别写日志程序

/************************************************************************/ /* * 文件名称&#xff1a;write_log.cpp * 摘 要&#xff1a;此文件实现了普通WINDOWS程序中的日志功能 * 主要有以下特点&#xff1a; * 1. 根据日期创建日志文件目录&#xff0c;每天的日志分别…

达内——java变量

package xx;//为class文件分目录 import xx.xx//导入包中的类 public class 类名{ public static void main(String args[]){ } } 准备工作&#xff1a; jdk jre jvm gc idea pi 配置环境变量 变量名支持字母&#xff0c;数字&#xff0c;_和$&#xff0c;但是数字不能开头&…

JSON Web Tokens测试工具

JSON Web Tokens官方提供测试工具https://jwt.io某些静态资料需要链接google、twitter服务器&#xff0c;被墙无法访问。现在提供可以方法测试工具http://hingtai.cn:8000/转载于:https://www.cnblogs.com/birdstudio/p/7985617.html

oracle 分页写法

select * from (select ROWNUM RN ,TT.* from ( select * from YQ_FEED_BACK_MESSAGE WHERE MODEL_TYPE 3 AND FEED_BACK_TYPE4 order by FEED_BACK_DATE DESC)TT where rownum<5 )where RN >0

给GRUB添加新的项目

安装了win10&#xff0c;然后又安装了manjaro&#xff0c;最后又安装了Ubuntu。开机默认就是进入的Ubuntu的grub&#xff0c;然而我比较喜欢manjaro的grub主题。在bios中设置manjaro的引导为默认引导&#xff0c;但是此时manjaro的grub没有Ubuntu&#xff0c;进入到manjaro系统…

Netapp存储基础之WAFL, NVRAM, RAID, SnapShot

此章节是重点之重点。先讲基本概念。WAFL的全称是Write Anywhere File Layout. 从类似于其它UNIX的文件系统比如Berkeley Fast File System (FFS) 和 TransArc Episode file system. 它的核心理念是"文件任意地方写"。先说普通的文件系统&#xff0c;是由inode和data…

读取本地照片 以流的形式进行显示

获取到前端传来的文件名称&#xff0c;到相应的文件中去读取&#xff0c;通过流的形式写到响应体中。 /*** 显示图片 * getFeedBackPicture.do?picName* return*/RequestMapping(value"/viewPhoto/{photopath}")public void getFeedBackPicture(HttpServletRespons…

如何轻松搞定机构资格准入?

银联的“资格入网”虽涉及环节庞杂&#xff0c;但杂而有序&#xff0c;初次接触银联的机构极有可能不知道先从哪一步骤开始&#xff0c;很多用户甚至不知道该怎么填写材料&#xff0c;所以我整理了一份详细的入网流程&#xff0c;以供大家参考&#xff0c;希望能帮助到大家~ 入…

eclipse CreateProcess error=87 的解决办法

有的说是 ClassPath过长&#xff0c;有的说是Eclipse插件导致最后 在这里得到解决啦http://code.google.com/p/googleappengine/issues/detail?id1862In C:\google\appengine-java-sdk-1.3.1\config\user\ant-macros.xmlChange line 102from<fileset dir"{war}/WEB-IN…

学习javascript 非常好的博客

这个大牛写的非常好&#xff01;&#xff01;推荐一下 http://www.cnblogs.com/xiaohuochai/tag/javascript%E6%80%BB%E7%BB%93/default.html?page8 小火柴的蓝色理想 转载于:https://www.cnblogs.com/oxspirt/p/7987342.html

Flex自定义组件

项目中需要用到如下一个效果。下图中五个圆代表一个五孔的梅花管。客户在后台操作时需要编辑梅花管的每个子孔占用情况。客户的要求是&#xff1a;点击某一个孔&#xff0c;小孔变黑&#xff0c;表明此孔被占用&#xff1b;再次点击&#xff0c;则小孔再变成透明圆形&#xff0…

解决在SQL Server 2000的存储过程不能调试

本机上: 控制面板—>管理工具—>服务—>MSSQL&#xff08;默认的ID&#xff09;—>属性—>登陆—>选一个Windows帐户&#xff0c;填写密码&#xff0c;再重新启动SQL Server 2000就可以调试存储过程了。 看一看sql数据库的版本&#xff0c;如果是kf版则不能进…