• C++创建窗口程序初步


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

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

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

    (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 于华中农业大学

     

     

  • 相关阅读:
    c# Linq及Lamda表达式应用经验之 GroupBy 分组
    页面加载完之后在执行js代码
    C#循环声明一个类
    通过文件流stream下载文件
    jquery validate如何不提交表单就做验证(ajax提交数据)
    用vs2012的命令利用xsd文件生成对应的C#类,把xml的string类型映射到生成的类
    用xsd验证xml
    MVC中如何跳过对模型中某个属性的验证
    用list<类>集合接收一个网址返回的一个类的集合的XML
    Mac 查看Volumes
  • 原文地址:https://www.cnblogs.com/acm-icpcer/p/6815090.html
Copyright © 2020-2023  润新知