按照helloword的創建過程 創建一個新的項目(項目名:window)
之后進行多窗口的實現過程:
第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>
![]()
<ignore_js_op>
![]()
當放開鼠標后,會彈出配置連接對話框,這里我們選擇pushButton
的clicked()
信號和LoginDlg
的accept()
槽並按下確定按鈕。如下圖所示。
<ignore_js_op>
![]()
設置好信號和槽的關聯后,界面如下圖所示。
<ignore_js_op>
![]()
這里簡單介紹一下信號和槽:大家可以把它們都看做是函數,比如這里,當單擊了按鈕以后就會發射單擊信號,即clicked();然后對話框接收到信號就會執行相應的操作,即執行accept()槽。一般情況下,我們只需要修改槽函數即可,不過,這里的accept()已經實現了默認的功能,它會將對話框關閉並返回QDialog::Accepted標識,所以無需再做更改。下面我們要使用返回的QDialog::Accepted標識來判斷是否按下了登錄按鈕。
完成后,可以
按下 <ignore_js_op>
![]()
四、使用自定義的對話框類
1.
按下Ctrl+2
返回代碼編輯模式,在這里打開main.cpp
文件,添加代碼:
在這里,我們先創建了LoginDlg
類的對象dlg
,然后讓dlg
運行,即執行exec()
函數,這樣會顯示對話框窗口,然后判斷exec()
的返回值,如果用戶按下了登錄按鈕,那么返回值應該是Accepted
,這時就顯示主窗口,並正常執行程序;如果沒有按下登錄按鈕,那么就結束程序。
現在大家可以運行程序,測試一下效果。
2.
上面講述了一種顯示對話框的情況,下面再來講述一種情況。我們打開mainwindow.ui
文件進入設計模式,然后在“按鈕”部件上右擊並選擇轉到槽菜單,如下圖所示。
<ignore_js_op>
![]()
在彈出的轉到槽對話框中選擇第一個clicked()
信號並按下確定按鈕。這時會跳轉到編輯模式mainwindow.cpp
文件的on_pushButton_clicked()
函數處,這個就是自動生成的槽,已經自動在
mainwindow.h
文件中進行了聲明。我們只需要更改函數體即可。這里更改為:
我們創建了一個對話框對象,然后讓其顯示,創建時指定的this參數表明這個對話框的父窗口是MainWindow。注意還需要在mainwindow.cpp
文件的開頭
添加#include 頭文件包含。有的童鞋可能會問,如果多次按下按鈕,那么每次都會生成一個對話框,是否會造成內存泄露或者內存耗盡?這里簡單說明一下,Qt的對象樹機制保證了不會造成內存泄露,而且不用寫delete語句,因為指明了對話框的父部件,所以當主窗口MainWindow銷毀時會自動銷毀創建的對話框。當然,嚴謹的童鞋也可以在mainwindow.h文件中先定義一個對話框對象,並在構造函數中進行創建,然后再到這里使用。最后大家可以運行一下程序,查看效果。
|