Qt 多介面來回切換的問題以及Qt介面關閉與銷燬
阿新 • • 發佈:2019-02-11
Qt 中我們經常會用到好幾個介面,那麼這幾個介面之間來回切換就是一個經常出現的問題。之前我也總是被這個問題困擾,現在寫一個樣例程式當作一種解決方案,希望能給大家啟發。
首先我定義了兩個介面,一個主介面,一個是子介面,我希望它們兩個能互相切換。主介面和子介面如圖所示:
子介面:
主要程式如下所示:
首先是主介面:在Mainwindow裡面,當點選pushbutton之後,應該做這麼幾件事:第一件事是主介面消失(當然根據實際情況你也可以選擇讓它關閉)。第二件事是new一個子介面出來,並且讓他顯示。還有最重要的是定義一個訊號與槽,使得在子介面點選 “轉到主介面” 按鈕的時候,主介面能顯示。所以程式如下所示:
void MainWindow::on_pushButton_clicked()
{
this->hide();//主介面關閉
video *videodlg = new video(this);//新建子介面
connect(videodlg,SIGNAL(sendsignal()),this,SLOT(reshow()));//當點選子介面時,呼叫主介面的reshow()函式
videodlg->show();//子介面出現
}
對於子介面,應該做的事情是當點選 “轉到主介面” 的時候,關閉子介面並且回到主介面。所以它的頭函式如下:
#ifndef VIDEO_H #define VIDEO_H #include <QDialog> namespace Ui { class video; } class video : public QDialog { Q_OBJECT public: explicit video(QWidget *parent = 0); ~video(); private slots: void on_pushButton_clicked(); signals: void sendsignal();//這個函式使用者向主介面通知關閉的訊息 private: Ui::video *ui; }; #endif // VIDEO_H
子介面的.cpp如下:
#include "video.h" #include "ui_video.h" #include <QDebug> video::video(QWidget *parent) : QDialog(parent), ui(new Ui::video) { ui->setupUi(this); this->setAttribute(Qt::WA_DeleteOnClose,1); qDebug()<<"構造了video視窗"<<endl; } video::~video() { delete ui; } void video::on_pushButton_clicked() { emit sendsignal(); this->close(); }
當點選了子介面的按鈕時候,出發了sendsignal函式。首先子介面會關閉,並且這個函式會出發主介面的reshow()函式,這個函式會讓主介面重新出現,這也就是兩個介面來回切換的原理,多個介面的切換道理是一樣的。主介面reshow()函式如下:
void MainWindow::reshow(){
this->show();
}
其實我還想說的是關於介面關閉和銷燬的問題。如果讀懂了上面的程式就會發現,在切換過程中,主介面是一直存在的,他只是有時候用hide()函式暫時消失;之後再用show()函式讓它重新顯示了。這麼做的原因是我用了connect函式。第三個引數是this,this指標必須作用在當前自己上面,也就是目前必須有一個存在的mainwindow實體。所以我用的是hide函式隱藏它,而不是close函式銷燬它。
但是對於子介面情況就不一樣了,子介面我覺得既可以銷燬也可以隱藏,這取決於實際的工程你想要怎麼樣,在這裡我用的是銷燬。每次銷燬之後,當主介面點選跳轉子介面的按鈕的時候再進行重新構建子介面,所以我用的是close()函式。但是這裡也需要用到這句話:
this->setAttribute(Qt::WA_DeleteOnClose,1);
我在銷燬的時候,這個函式用於把介面的所有變數銷燬,如果不想銷燬就把1置位為0.所以要想好,當你的介面還有一些你需要的變數的時候,不能用這個函數了,當然初始化的時候建構函式怎麼初始化變數也值得考慮,我在工程中也遇到了不少問題,不過腦子導致了錯誤。
總之,這裡記錄了關於Qt多介面來回切換的思路,如果有人覺得有更好的從一個介面跳轉到另一個介面的方法一定要告訴我,謝謝了。文中還有對於介面關閉和銷燬的一點看法,歡迎大家拍磚。