zoukankan      html  css  js  c++  java
  • 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 于华中农业大学

     

     

  • 相关阅读:
    关于这个 blog
    P6499 [COCI2016-2017#2] Burza 题解
    CF1172F Nauuo and Bug 题解
    CF1479D Odd Mineral Resource 题解
    CF1442E Black, White and Grey Tree 题解
    CF1442D Sum 题解
    CF1025D Recovering BST 题解
    CF1056E Check Transcription 题解
    CF1025F Disjoint Triangles 题解
    红包算法的PHP实现
  • 原文地址:https://www.cnblogs.com/acm-icpcer/p/6815090.html
Copyright © 2011-2022 走看看