http://blog.163.com/modingfa_002/blog/static/11092546620108810047146/
1.如果使用exec()默認爲模態的。如果用show()需要設置setModel(true)纔是模態的。
2.當刪除一個dialog對象時,exec()返回QDialog::Rejected,因此在刪除dialog時要特別小心。舉例說明一下:
A 是一個QWidget 。B是一個QDialog,B = new QDialog(A)。
int rec = B->exec();
if (!thisDeleted)
{
if (rec == QDialog::Accepted)
emit endSession();
if (rec == QDialog::Rejected)
emit endSession2();
}
endSession()和 endSession2()都是A得成員函數。當刪除A時,B也會刪除(因爲B得parent是A),這個時候exec()會返回 QDialog::Rejected,此時下面的 emit endSession2()還會繼續執行,這個時候就會出現端錯誤了,因爲A比B先刪除,而此時還要調用A的成員,A都被刪除了,還能調用其成員函數?要 是能調用就奇了怪了。因此在類A中多了個靜態變量thisDeleted,記得在析構A的時候把這個值改變了,這樣就不會在調用emit endSession2(),也就不會出現段錯了。
3.exec()是一個循環時間函數,哪它什麼時候才能返回了?當調用 accept()(返回QDialog::Accepted), reject()(返回QDialog::Rejected),done(int r)(返回r),close()(返回QDialog::Rejected),hide()(返回 QDialog::Rejected),destory()(返回QDialog::Rejected)。還有就是delete 自己的時候也會返回 QDialog::Rejected(destory()就會delete自己)。
4.close()會銷燬對象嘛。答案是隻有當設置了 setAttribute(WA:closeOnDelelte)是纔會刪除,如果這個標誌沒有設置,其作用和hide(),setvisible(false)一樣,只會隱藏改對象。
5.當dialog在exec()時候。後臺線程同樣可以操作界面,如收到每個消息,還可以彈出QDialog。