C++创建窗口程序初步

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

MainWindow w;
w.show();

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

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

void f()
{
      MainWindow w;
      w.show();
}

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

(3)

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

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

MainWindow* w=new MainWindow();

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

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

void f()
{
      MainWindow* w = new MainWindow();
      w->show();
      return w;
}
int main()
{
      MainWindow* p = f();
      delete p;
}

(4)

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

那么这有两种实现方法:

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

startTimer(5000);

同时还要设置函数:

void MainWindow::timerEvent(QTimerEvent *e)
{
    close();
}

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

QTimer * timer = new QTimer;
MainWindow* p=function1();
//delete p;
Qobject::connect(timer,&QTimer::timeout,p,&MainWindow::close);
timer->start(5000);

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

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

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

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

(1
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
protected:
    void timerEvent(QTimerEvent *e);
};

#endif // MAINWINDOW_H

(2
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    startTimer(5000);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::timerEvent(QTimerEvent *e)
{
    //close();
}

3
#include "mainwindow.h"
#include <QApplication>
#include <QTimer>

MainWindow* function1()
{
    MainWindow* w=new MainWindow();
    w->show();//(*w).show();
    //for(int i1=0;i1<999999;i1++){for(int i2=0;i2<999999;i2++){}   }
    //delete w;
    return w;
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    /*MainWindow w;
    w.show();*/
    QTimer * timer = new QTimer;

    MainWindow* p=function1();
    //delete p;

    QObject::connect(timer,&QTimer::timeout,p,&MainWindow::close);

    timer->start(5000);

    int result = a.exec();
    delete p;
    return result;
}

TZ

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

 

时间: 2024-08-07 09:30:25

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

学MFC之前必须会的金典创建窗口程序的过程代码

#include <windows.h> // 窗口过程函数 LRESULT CALLBACK MyWndProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_DESTROY: PostQuitMessage (0); return 0; case WM_PAINT: PAINTSTRUCT ps; HDC hDC = BeginPaint (hwnd, &ps); Ell

【DirectX11-Tutorial】编写第一个窗口程序creating a window

本系列主要参考此博客的文章l,同时会加上一点个人实践过程. ========================================== 分割线 ========================================== 这篇文章主要分为三个部分,首先是看一下创建窗口完整的代码,然后了解程序运作的主要细节,最后如何修改这些代码. 接下来开始第一个窗口程序,上一个程序中使用WinMain()函数开始整个程序,这一次将结合另一个函数WinProc(),这个函数将处理程序每一个系统运

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

MFC应用程序中处理消息的顺序 1.AfxWndProc()      该函数负责接收消息,找到消息所属的CWnd对象,然后调用AfxCallWndProc 2.AfxCallWndProc()  该函数负责保存消息(保存的内容主要是消息标识符和消息参数)供应用程序以后使用,然后调用WindowProc()函数 3.WindowProc()      该函数负责发送消息到OnWndMsg()函数,如果未被处理,则调用DefWindowProc()函数 4.OnWndMsg()        该函

创建窗口的应用程序

通过前面的基础知识的学习,已经对ctypes库的基本功能学会了使用,为了加强这种知识训练,以及运用刚学习的知识的快乐,我们来创建一个稍稍复杂一点的应用程序.这个应用程序是所有后面应用程序的基础,只有学会这个程序的基本原理,才可以更进一步学习WIN32的API程序开发.更何况后面所有程序都会在这个程序上修改而成,这个就相当你的爬向高楼顶层的第一个台阶.在所有工程技术里,都会从一个小小的演示程序开始,逐渐地增加功能,慢慢地变成一个强大的应用程序.如果发现这些API函数不清楚,可以参考我写的另外一本书

Win32API 窗口程序的创建7大步骤

1 定义WinMain入口函数 2 定义窗口处理函数 WindowsProc(用来处理消息.有如公司业务处理,具体干活的人.) 3 注册窗口类 RegisterClass(往系统中写数据.有如在工商局把填表并提交上去注册公司) 4 创建窗口 CreateWindows (在内存中创建窗口出来.申请了一块内存,保存了关于窗口的数据.有如实体公司有了地点空间,装修好了,并有了从业人员等.) 5 显示窗口 ShowWindows/UpdateWindow (显示窗口,把窗口绘制在显示器上.有如公司开张

控制台下创建窗口和WinMain入口创建窗口简单程序

控制台创建窗口(同时有控制台窗口和新创建的窗口)(项目类型:控制台应用程序) #include "windows.h" #include "TCHAR.h" LRESULT CALLBACK WindowProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); int _tmain(int argc, _TCHAR* argv[]) { HINSTANCE hInstance; hInstance = G

56 java编程思想——创建窗口和程序片 用户接口API

56.java编程思想--创建窗口和程序片 用户接口API Java 1.1 版同样增加了一些重要的新功能,包括焦点遍历,桌面色彩访问,打印"沙箱内"及早期的剪贴板支持. 焦点遍历十分的简单,因为它显然存在于AWT 库里的组件并且我们不必为使它工作而去做任何事.如果我们制造我们自己组件并且想使它们去处理焦点遍历,我们过载isFocusTraversable()以使它返回真值.如果我们想在一个鼠标单击上捕捉键盘焦点,我们可以捕捉鼠标按下事件并且调用requestFocus()需求焦点方法

52 java编程思想——创建窗口和程序片 程序片限制

52.java编程思想--创建窗口和程序片 程序片限制 出于安全缘故,程序片十分受到限制,并且有很多的事我们都不能做.您一般会问:程序片看起来能做什么,传闻它又能做什么:扩展浏览器中WEB 页的功能.自从作为一个网上冲浪者,我们从未真正想了解是否一个WEB 页来自友好的或者不友好的站点,我们想要一些可以安全地行动的代码.所以我们可能会注意到大量的限制: (1) 一个程序片不能接触到本地的磁盘.这意味着不能在本地磁盘上写和读,我们不想一个程序片通过WEB页面阅读和传送重要的信息.写是被禁止的,当然

创建简单的窗口程序

#include <windows.h> /*窗口函数的函数原型*/ LRESULT CALLBACK MainWndProc(HWND, UINT, WPARAM, LPARAM); int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {     char szClassName[] = "MainWClass";     WND