Qt在程序執行的過程中刷新界面

qt程序執行的過程中,一般是不會僅僅通過setText函數將文字刷新到界面上,如果想根據需要不斷地顯示文字到主界面上該怎麼做呢?

    爲什麼不會刷新界面呢,這是由於調用show函數之後,並不能顯示界面,必須調用如下圖片的中的a.exec函數才能刷新出界面,而這個函數肯定最後才能執行到,所以一般在主線程中進行的setText向界面上添加文字的操作,只有a.exec()執行後才顯示。

 

自己給自己發信號,編譯之後還是在主線程中。因爲自己發的信號連接的槽中寫個死循環,那主線程也就死掉了,出不來了。自己給自己發信號來刷新界面也是行不通的。

方法一:開啓線程,創建一個C++類繼承QThread,也能實現,但我認爲有以下三個缺點。

        缺點一:

        線程一般是進行一些費時較長的操作。所以主線程就先執行完,先調到a.exec這個函數。支路線程就可以通過發信號,指導主界面上文字的顯示了。但是支路線程發一次信號,而槽函數中調用100次setText,那也是100次執行完之後,只顯示最後的一個結果,還是看不到中間的過程,那就採取的方式就是發一次信號setText一次。

        缺點二:

        讓主界面與線程對象通信,線程發信號(信號參數爲要發的文字),主界面槽函數連接這個信號,這樣線程->start()就能啓動線程,執行重寫的run函數,在run函數中發信號,刷新界面了。由於start(),run()都不帶參數,那我們線程發信號(信號參數爲要發的文字)所需要的參數,就只能從線程執行的函數(比如說轉移本地數據到遠程數據庫)當中獲取了。這就意味着,我們創建一個本地數據轉移到遠程的界面之後,本地數據轉移到遠程這個函數,不能寫在界面同名的那個cpp當中,卻要寫在另外開的一個線程類中。

       缺點三:

       如果支路線程中,轉移數據時,出現了可處理的異常,這時想彈出一個界面,讓人工選擇判斷處理,這是做不到的,因爲線程中不能出現ui界面相關的東西,如果出現了,一編譯就會報錯。

     注:或許你能發信號讓主界面彈出ui界面,將選擇的結果,再通過發信號通知線程,如果這樣的話,就得讓線程再給主界面發彈出ui界面的信號後,等待一下選擇的結果。如何等待呢?我的等待方法是 

         while(flag)

              QThread::sleep(1)

每隔一秒,看看flag是否爲true,如果選擇完畢後,主界面發信號回來,將flag賦值false,此時支路線程繼續往下走。也可行,比較折騰。

方法二:向界面上添加文字時,setText(文字);然後緊接着 qApp->processEvents(),這句代碼能及時刷新界面,a.exec()當中其實調用的也是這個函數。

    如果初始化的過程中想不停地刷新界面,那就在構造函數中,刷新界面前,調用this->show,然後qApp->processEvents()。

 

[static] void QCoreApplication::processEvents(QEventLoop::ProcessEventsFlags flags = QEventLoop::AllEvents)

Processes all pending events for the calling thread according to the specified flags until there are no more events to process.

You can call this function occasionally when your program is busy performing a long operation (e.g. copying a file).

In the event that you are running a local loop which calls this function continuously, without an event loop, the DeferredDelete events will not be processed. This can affect the behaviour of widgets, e.g. QToolTip, that rely on DeferredDelete events to function properly. An alternative would be to call sendPostedEvents() from within that local loop.

Calling this function processes events only for the calling thread.

Note: This function is thread-safe.

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章