模態對話方塊使用了exec()
函式將其顯示出來。exec()
函式的真正含義是開啟乙個新的事件迴圈(我們會在後面的章節中詳細介紹有關事件的概念)。所謂事件迴圈,可以理解成乙個無限迴圈。qt 在開啟了事件迴圈之後,系統發出的各種事件才能夠被程式監聽到。這個事件迴圈相當於一種輪詢的作用。既然是無限迴圈,當然在開啟了事件迴圈的地方,**就會被阻塞,後面的語句也就不會被執行到。因此,對於使用了exec()
顯示的模態對話方塊,我們可以在exec()
函式之後直接從對話方塊的物件獲取到資料值。
void qttest::open()
需要注意的一點是,如果我們設定 dialog 的屬性為wa_deleteonclose
,那麼當對話方塊關閉時,物件被銷毀,我們就不能使用這種辦法獲取資料了。在這種情況下,我們可以考慮使用 parent 指標的方式構建對話方塊,避免設定wa_deleteonclose
屬性;或者是利用另外的方式。
實際上,qdialog::exec()
是有返回值的,其返回值是qdialog::accepted
或者qdialog::rejected
。
模態對話方塊相對簡單,如果是非模態對話方塊,qdialog::show()
函式會立即返回,如果我們也這麼寫,就不可能取得使用者輸入的資料。因為show()
函式不會阻塞主線程,show()
立即返回,使用者還沒有來得及輸入,就要執行後面的**,當然是不會有正確結果的。那麼我們就應該換一種思路獲取資料,那就是使用訊號槽機制。
由於非模態對話方塊在關閉時可以呼叫qdialog::accept()
或者qdialog::reject()
或者更通用的qdialog::done()
函式,所以我們可以在這裡發出訊號。另外,如果找不到合適的訊號發出點,我們可以重寫qdialog::closeevent()
函式,在這裡發出訊號。
另外不要擔心如果對話方塊關閉,是不是還能獲取到資料。因為 qt 訊號槽的機制保證,在槽函式在呼叫的時候,我們始終可以使用sender()
函式獲取到 signal 的發出者。關於sender()
函式,可以在文件中找到更多的介紹。順便說一句,sender()
函式的存在使我們可以利用這個函式,來實現乙個只能開啟乙個的非模態對話方塊(方法就是在對話方塊開啟時在乙個對話方塊對映表中記錄下標記,在對話方塊關閉時利用sender()
函式判斷是不是該對話方塊,然後從對映表中將其刪除)。
6 對話方塊之間的資料傳遞
模態對話方塊中 1.全域性變數法 主對話方塊cpp檔案定義乙個全域性變數,例如 cstring strtext 子對話方塊.h檔案中extern cstring strtext 宣告一下 2.主對話方塊法 afxgetmainwnd 能獲取主對話方塊視窗的指標 c資料傳遞dlg pmainwnd c...
再談MFC學習 模態對話方塊的資料傳遞
學習c 的目的就是為了使用封裝好的類,而最最經典的封裝類當然是微軟的mfc視窗程式類。學習mfc程式設計之前要學習c 的主要知識,掌握c 的基本程式設計思想。下面就看下我學習的mfc模態對話方塊的資料傳遞。首先,什麼叫做模態對話方塊呢?模態對話方塊指的是當彈出這樣的對話方塊的時候,程式不能相應除了此...
對話方塊值傳遞
應用場景 主對話方塊裡的選單開啟新建對話方塊1,在對話方塊1中獲取對話方塊2輸入的文字資料,並在主對話方塊裡顯示 思路如下 為對話方塊1和對話方塊2建立類cdialog1和cdialog2 在主對話方塊類中新增變數cdialog1 dlg1 在類cdialog1 中新增物件 cdialog2 dlg...