Qt學習--信號與槽(多窗口的實現)


按照helloword的創建過程 創建一個新的項目(項目名:window)

之后進行多窗口的實現過程:

(參考:http://www.qter.org/portal.php?mod=view&aid=27&page=3)

第2篇 Qt5基礎(二)編寫Qt多窗口程序 

 
三、添加登錄對話框



1. 往項目中添加新文件,這里可以在編輯模式左側的項目目錄上右擊,然后選擇添加新文件菜單,如下圖所示。當然也可以在文件菜單中進行添加。
 
<ignore_js_op>


2. 模板選擇Qt 分類中的Qt 設計師界面類,然后界面模板選擇Dialog withoutButtons ,如下圖所示。
 

<ignore_js_op>


3. 單擊下一步進入類信息界面,這里將類名更改為LoginDlg (注意類名首字母一般大寫)。如下圖所示,下面的相關文件會自動改名。
 
<ignore_js_op>


4. 當完成后會自動跳轉到設計模式,可以對新添加的對話框進行設計。我們向界面上拖入一個Push Button ,然后更改顯示文本為“登錄到主界面”。為了實現點擊這個按鈕后可以關閉該對話框並顯示主窗口,我們需要設置信號和槽的關聯。點擊設計模式上方的 <ignore_js_op>   圖標,或者按下F4 ,便進入了信號和槽編輯模式。按着鼠標左鍵,從按鈕上拖向界面,如下圖所示。
 
<ignore_js_op>

        當放開鼠標后,會彈出配置連接對話框,這里我們選擇pushButton clicked() 信號和LoginDlg accept() 槽並按下確定按鈕。如下圖所示。
 
<ignore_js_op>


        設置好信號和槽的關聯后,界面如下圖所示。
 

<ignore_js_op>


這里簡單介紹一下信號和槽:大家可以把它們都看做是函數,比如這里,當單擊了按鈕以后就會發射單擊信號,即clicked();然后對話框接收到信號就會執行相應的操作,即執行accept()槽。一般情況下,我們只需要修改槽函數即可,不過,這里的accept()已經實現了默認的功能,它會將對話框關閉並返回QDialog::Accepted標識,所以無需再做更改。下面我們要使用返回的QDialog::Accepted標識來判斷是否按下了登錄按鈕。
        完成后,可以 按下 <ignore_js_op>  圖標或者F3鍵 來返回控件編輯模式。

 

四、使用自定義的對話框類



 

 

1. 按下Ctrl+2 返回代碼編輯模式,在這里打開main.cpp 文件,添加代碼:   
  1.  2 #include "mainwindow.h"  3 #include "logindlg.h"
     4 int main(int argc, char *argv[])  5 {  6  QApplication a(argc, argv);  7  MainWindow w;  8     LoginDlg dlg;                        // 建立自己新建的LoginDlg類的實例dlg
     9     if(dlg.exec() == QDialog::Accepted) // 利用Accepted返回值判斷按鈕是否被按下
    10  { 11         w.show();                      // 如果被按下,顯示主窗口
    12         return a.exec();              // 程序一直執行,直到主窗口關閉
    13  } 14     else return 0;          //如果沒有被按下,則不會進入主窗口,整個程序結束運行
    15 }

     


        在這里,我們先創建了LoginDlg 類的對象dlg ,然后讓dlg 運行,即執行exec() 函數,這樣會顯示對話框窗口,然后判斷exec() 的返回值,如果用戶按下了登錄按鈕,那么返回值應該是Accepted ,這時就顯示主窗口,並正常執行程序;如果沒有按下登錄按鈕,那么就結束程序。

 

        現在大家可以運行程序,測試一下效果。

 

 


2. 上面講述了一種顯示對話框的情況,下面再來講述一種情況。我們打開mainwindow.ui 文件進入設計模式,然后在“按鈕”部件上右擊並選擇轉到槽菜單,如下圖所示。

 

 

 

<ignore_js_op>


        在彈出的轉到槽對話框中選擇第一個clicked() 信號並按下確定按鈕。這時會跳轉到編輯模式mainwindow.cpp 文件的on_pushButton_clicked() 函數處,這個就是自動生成的槽,已經自動在 mainwindow.h 文件中進行了聲明。我們只需要更改函數體即可。這里更改為:

 

 

 

  1. 1 void MainWindow::on_pushButton_clicked()
    2 {
    3    QDialog *dlg = new QDialog(this);
    4    dlg->show();  
    5 }

     

 

 

 

     我們創建了一個對話框對象,然后讓其顯示,創建時指定的this參數表明這個對話框的父窗口是MainWindow。注意還需要在mainwindow.cpp 文件的開頭 添加#include 頭文件包含。有的童鞋可能會問,如果多次按下按鈕,那么每次都會生成一個對話框,是否會造成內存泄露或者內存耗盡?這里簡單說明一下,Qt的對象樹機制保證了不會造成內存泄露,而且不用寫delete語句,因為指明了對話框的父部件,所以當主窗口MainWindow銷毀時會自動銷毀創建的對話框。當然,嚴謹的童鞋也可以在mainwindow.h文件中先定義一個對話框對象,並在構造函數中進行創建,然后再到這里使用。最后大家可以運行一下程序,查看效果。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM