技術部落格3

2021-08-02 09:54:46 字數 1745 閱讀 5337

模態對話方塊與事件迴圈

兩種常規用法:

qdialog * dlg = new qdialog()

dlg->show();

當然,這兒用指標(即分配到heap中)不是必須的。  (有疑問?或者有時發現視窗一閃而過?那麼你需要了解c、c++中變數的作用域和生存週期)

qdialog dlg;

dlg.exec();

這種情況下,我們一般都是將物件分配上 stack 上,而不是heap上。

當然,你喜歡用 heap,也沒問題:

dialog * dlg = new qdialog();

dlg->exec();

delete dlg;

前面的 show() 與 exec() 並不是模態與非模態的區別。

想讓乙個widget成為模態,我們只需要對其設定:

setattribute(qt::wa_showmodal, true);
注意:這是qwidget的成員函式,也就是說,qwidget可以顯示為模態或非模態!

除了直接呼叫setattribute外,qwidget 提供了乙個易用的函式,來設定窗體的模態。其原始碼如下:

void qwidget::setwindowmodality(qt::windowmodality windowmodality)

如果你沒有使用qdialog::open()的需求,你可能也不需要該函式。

除了qwidget提供的成員,qdialog 提供了 setmodal 的成員函式,我們看看其**:

void qdialog::setmodal(bool modal)

不用解釋了吧?我們要顯示模態對話方塊,只需要類似下面的**:

qdialog * dlg = new qdialog();

dlg->setattribute(qt::wa_showmodal, true);

dlg->show();

有問題是不?為啥exec() 直接可以顯示模態對話方塊呢?看qdialog源**吧

int qdialog::exec()

看到答案沒:exec() 先設定modal屬性,而後呼叫 show() 顯示對話方塊,最後啟用事件迴圈

用前面的 qdialog::exec() 一樣,都是呼叫的 qeventloop::exec()

int qeventloop::exec(processeventsflags flags)

bool qeventloop::processevents(processeventsflags flags)

進一步:這將呼叫平台相關的函式,比如在windows下

bool qguieventdispatcherwin32::processevents(qeventloop::processeventsflags flags)

事件迴圈和執行緒沒有必然的聯絡,事件迴圈可以用在qthread中,而且從qt4.4開始,qthread的run函式預設就呼叫了自己的事件迴圈。

對與qdialog來說,當它自己的qeventloop啟用時,主程式的 qeventloop 當然是處於暫停狀態了。說到底,就是兩個死迴圈,乙個在內,乙個在外,只有裡面的退出後,外邊的迴圈才會執行。不過由於兩個迴圈執行的命令是基本一樣的,都是呼叫並處理程式收到的各種事件,所以,可能變得不容易理解

技術部落格3

表單是乙個容器,用來儲存客戶端使用者填寫的資訊的容器,通過提交按鈕將表單容器裡面的資訊提交到伺服器儲存起來,以後可以呼叫。id 指的是表單的id 唯一 js通過表單id操作表單 name 指的是表單的名字 不唯一 同上 action 指的是處理表單或者接收表單資訊的url method 指的是表單提...

技術部落格3

陣列是一組連續的記憶體空間,下標從0開始最大下標為一。陣列元素是變數。陣列的元素型別,是定義陣列時申明的型別,每個元素型別都一致。陣列建立後長度不能改變,陣列建立後會對每個元素都初始化 例 int 0 double 0.0 引用型別 null。什麼時候用迴圈結構 當對某些 執行很多次時,使用迴圈到語...

技術部落格 JFinal增刪改查學習3

每次學習完jfinal框架都會有不同的感受和更深的認識,這周對於增刪改查的學習,也讓我受益匪淺。增刪改查跟資料庫是有一定聯絡的,假如想要實現乙個模組的增刪改查,首先要明白功能的 結構,以及資料互動的工作原理。上週主要是認識到mvc,mvc是模型 model 檢視 view 控制器 controlle...