写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文!

本博客全网唯一合法URL:https://www.cnblogs.com/acm-icpcer/p/6815090.html 

本篇博客的内容基于QT环境面向Windows编程所写。

(1)在主函数里面使用类似下面的语句:

  1. MainWindow w;
  2. w.show();

这样创建的窗口只有在程序结束运行的时候才会消失。

(2)写一个函数,在函数里面用(1)的代码创建窗口,这样,在函数调用完毕出栈的时候窗口就会释放消失。

  1. void f()
  2. {
  3. MainWindow w;
  4. w.show();
  5. }

这样,运行的感觉就是窗口刚出现就消失,即一闪而过。

(3)

如果在函数里面创建了一个窗口,但是我不希望它在函数调用结束的时候被释放消失,那么考虑到我在java编程随感里面写到的,在函数中创建的窗口生成在方法栈中。如果想要在函数调用结束时窗口不被释放,那么应该将窗口对象生成在堆中而不是栈中,那么这时的窗口除非程序被人为关闭,否则只有在计算机掉电的时候才会被关闭并在堆中被删除(在这种情况下,必然要使用到指针)。

考虑在函数中写如下代码:

MainWindow* w=new MainWindow();

这样,就实现了在栈中产生指针,而实际上该窗口对象被操作系统所分配的内存则在堆中。故而,虽然函数调用结束时指针会被释放,但是在堆中的窗口对象则不会被释放,看到的结果就是窗口会一直存在。

当然,如果你想让窗口在堆中的内存被释放,只能自己手动用delete关键字删除指针(这个操作可以在函数外通过return指针实现),例如:

  1. void f()
  2. {
  3. MainWindow* w = new MainWindow();
  4. w->show();
  5. return w;
  6. }
  7. int main()
  8. {
  9. MainWindow* p = f();
  10. delete p;
  11. }

(4)

上面的这个代码跑后,还是会闪屏,那么就希望让窗口停留一段时间后再关闭。

那么这有两种实现方法:

1)在 MainWindow的构造函数中设置timer对象,即时间器,以设置停留的时间:

startTimer(5000);

同时还要设置函数:

  1. void MainWindow::timerEvent(QTimerEvent *e)
  2. {
  3. close();
  4. }

2)或者在主函数中设置QTimer对象:

  1. QTimer * timer = new QTimer;
  2. MainWindow* p=function1();
  3. //delete p;
  4. Qobject::connect(timer,&QTimer::timeout,p,&MainWindow::close);
  5. timer->start();

(5)有一个意思的小技巧,在main函数中为了关闭从函数中创建并被返回的窗口,一般采用删除函数返回的指针的方式来实现。那delete语句写在主函数的什么地方是有效的呢?

答案是只要在主函数的返回语句之前都是有效的。如执行下列语句时,窗口一样会被删除。

  1. int result = a.exec();
  2. delete p;
  3. return result;

(6)同样的,综合所有知识得到如下代码:


  1. #ifndef MAINWINDOW_H
  2. #define MAINWINDOW_H
  3.  
  4. #include <QMainWindow>
  5.  
  6. namespace Ui {
  7. class MainWindow;
  8. }
  9.  
  10. class MainWindow : public QMainWindow
  11. {
  12. Q_OBJECT
  13.  
  14. public:
  15. explicit MainWindow(QWidget *parent = );
  16. ~MainWindow();
  17.  
  18. private:
  19. Ui::MainWindow *ui;
  20. protected:
  21. void timerEvent(QTimerEvent *e);
  22. };
  23.  
  24. #endif // MAINWINDOW_H

  25. #include "mainwindow.h"
  26. #include "ui_mainwindow.h"
  27.  
  28. MainWindow::MainWindow(QWidget *parent) :
  29. QMainWindow(parent),
  30. ui(new Ui::MainWindow)
  31. {
  32. ui->setupUi(this);
  33. startTimer();
  34. }
  35.  
  36. MainWindow::~MainWindow()
  37. {
  38. delete ui;
  39. }
  40.  
  41. void MainWindow::timerEvent(QTimerEvent *e)
  42. {
  43. //close();
  44. }
  45.  
  46.  

  47. #include "mainwindow.h"
  48. #include <QApplication>
  49. #include <QTimer>
  50.  
  51. MainWindow* function1()
  52. {
  53. MainWindow* w=new MainWindow();
  54. w->show();//(*w).show();
  55. //for(int i1=0;i1<999999;i1++){for(int i2=0;i2<999999;i2++){} }
  56. //delete w;
  57. return w;
  58. }
  59.  
  60. int main(int argc, char *argv[])
  61. {
  62. QApplication a(argc, argv);
  63. /*MainWindow w;
  64. w.show();*/
  65. QTimer * timer = new QTimer;
  66.  
  67. MainWindow* p=function1();
  68. //delete p;
  69.  
  70. QObject::connect(timer,&QTimer::timeout,p,&MainWindow::close);
  71.  
  72. timer->start();
  73.  
  74. int result = a.exec();
  75. delete p;
  76. return result;
  77. }

TZ

2017/5/5 于华中农业大学

 

C++创建窗口程序初步的更多相关文章

  1. QT源码解析(一) QT创建窗口程序、消息循环和WinMain函数

    QT源码解析(一) QT创建窗口程序.消息循环和WinMain函数 分类: QT2009-10-28 13:33 17695人阅读 评论(13) 收藏 举报 qtapplicationwindowse ...

  2. QT创建窗口程序、消息循环和WinMain函数(为主线程建立了一个QEventLoop,并执行exec函数)

    使用QT也有一段时间了,有的时候需要跟踪代码到QT的源码中去查找问题.在这里我将记录一下我跟踪QT源码学习到的一些知识. 我的开发环境是VC6.0+QT4.3.3.QT已经不为VC6.0提供addin ...

  3. emwin之在中断服务程序中创建窗口的结果

    @2019-04-28 [小记] 使用emwin设计器生成的程序,将该窗口创建放在中断服务程序中出现奇怪现象,非死机但功能间歇性异常,将创建窗口程序放于普通程序中则工作正常

  4. win32程序之窗口程序,以及消息机制

    win32程序值窗口程序,以及消息机制 一丶简介 通过上一讲.我们了解了窗口其实是绘制出来的.而且是不断绘制的过程. 所以窗口的本质是绘制. 但是我们现在看到的窗口程序.都可以点击关闭按钮. 使用鼠标 ...

  5. MFC程序的启动过程——先全局对象theApp(第一入口),后WinMain(真正入口),会引爆pApp->InitInstance从而创建窗口(程序员入口)

    原文出自:http://blog.csdn.net/yuvmen/article/details/5877271 了解MFC程序的启动过程,对于初学者来讲,了学习MFC很有帮助:对于不常用VC的人来说 ...

  6. MFC应用程序创建窗口的过程 good

    MFC应用程序中处理消息的顺序 1.AfxWndProc()      该函数负责接收消息,找到消息所属的CWnd对象,然后调用AfxCallWndProc 2.AfxCallWndProc()  该 ...

  7. 【MFC】如何在MFC创建的程序中更改主窗口的属性 与 父窗口 WS_CLIPCHILDREN 样式 对子窗口刷新的影响 与 窗体区域绘制问题WS_CLIPCHILDREN与WS_CLIPSIBLINGS

    如何在MFC创建的程序中更改主窗口的属性 摘自:http://blog.sina.com.cn/s/blog_4bebc4830100aq1m.html 在MFC创建的单文档界面中: (基于对话框的, ...

  8. 【C语言探索之旅】 第三部分第二课:SDL开发游戏之创建窗口和画布

    内容简介 1.第三部分第二课: SDL开发游戏之创建窗口和画布 2.第三部分第三课预告: SDL开发游戏之显示图像 第三部分第二课:SDL开发游戏之创建窗口和画布 在上一课中,我们对SDL这个开源库做 ...

  9. Cocos2dx集成于windows桌面窗口程序的步骤

    2D游戏需要做编辑器,而编辑器总是希望可以复用游戏中的逻辑来运行场景试看效果. 对于cocos2dx开发的程序,这个需求可以描述为: 实现一种方法,在桌面窗口程序中的某个控件上显示cocos2dx的场 ...

随机推荐

  1. error C4996: Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct

    使用VS13 跟  google protocbuf时出现了这个问题:真蛋疼,用别人的东西你就说不安全,用你自己的东西时你怎么不说不安全来着! 解决方案 在protoc   生成的头文件中加上 #pr ...

  2. junit的简单用法

    之前测试一个方法总要写一个main函数来调用,感觉既费事又有点low.今天来简单研究一下怎么使用junit来进行单元测试. 1. 依赖包 <dependency> <groupId& ...

  3. Apache Kafka 1.0.0正式发布!

    千呼万唤始出来,经过7年的发展与完善,Apache Kafka 1.0.0正式发布!在笔者看来,比起1.0.0引入的新功能,此版本最大的意义在于标识Kafka各种组件功能的稳定性.不过我们还是来看下1 ...

  4. VMware 14 的永久许可密钥

    VMware workstation 14永久激活密钥分享: CG54H-D8D0H-H8DHY-C6X7X-N2KG6 ZC3WK-AFXEK-488JP-A7MQX-XL8YF AC5XK-0ZD ...

  5. JS缺失错误- Uncaught SyntaxError: Unexpected token <

    这种情况,表明,缺少js文件 解决方式:在文件夹下将缺少js文件补足

  6. 【HubbleDotNet】HubbleDotNet配置安装注册key获取

    今天配置HubbleDotNet发现一个问题 安装界面需要注册key 点击[get key],跳转网页: http://www.hubbledotnet.com/key.aspx 结果网页有bug,坑 ...

  7. sass - 公用方法封装

    // 设置宽高 @mixin wh($wid,$hei){ @if $wid { width: $wid; } @if $hei { height: $hei; } overflow: hidden; ...

  8. Linux 安装GCC讲解(在线和无网离线)

    本文主要介绍如何在无网络的环境下怎么离线安装GCC,如果有网,只需要通过命令 yum install gcc 进行安装就可以了,yum会自动把所有关联的依赖包也一起安装了,一键安装. yum inst ...

  9. ELK系列五:Logstash输出到Elasticsearch和redis

    1.Logstash与Redis的读写 1.1 Logstash 写入Redis 看完Logstash的输入,想必大家都清楚了Logstash的基本用法,那就是写配置文件. output{ { red ...

  10. .NET 高性能WEB架构-比较容易改造方式 - .NET架构

    下面列出的一些,是我们常见而且比较容易去优化的方式,当然细节方面非常多,仅供参考: 1.数据库依然选择SQL Server数据库(最新的sqlserver功能是很强大的)和使用订阅发布进行单写多读的读 ...