1. 程式人生 > >Qt子執行緒更新UI的方法

Qt子執行緒更新UI的方法

     最近剛剛接觸一個qt專案,由於原始程式中的listwidget裡有大量的item,每一個item都有一個按鈕,這樣導致程式執行起來後,生成按鈕的速度很慢,嚴重影響了軟體的使用體驗。於是將生成按鈕的操作放到子執行緒中。一開始我是直接在子執行緒中生成按鈕來更新UI的,發現編譯可以通過,但是運作時報錯。上網查資料,才發現是Qt裡只有UI執行緒才可以更新UI,子執行緒要更新UI,可以通過使用訊號-槽函式機制,在子執行緒裡傳送訊號,然後將訊號與UI執行緒(即主函式)中的slot函式connect,這樣子執行緒執行時,將訊號傳送到訊息佇列,UI執行緒從訊息佇列依次取出訊號,呼叫相應的slot函式響應。從而達到更新UI介面的目的。

     子線裡面的訊號函式只需要宣告,不需要定義。當子執行緒與UI執行緒傳遞的不是qt元型別的資料時,要註冊訊息。子執行緒定義時要包括Q_OBJECT巨集。具體程式碼見

http://blog.csdn.net/slj_win/article/details/6856428

http://blog.chinaunix.net/uid-26808060-id-3355832.html

相關推薦

Qt執行更新UI方法

     最近剛剛接觸一個qt專案,由於原始程式中的listwidget裡有大量的item,每一個item都有一個按鈕,這樣導致程式執行起來後,生成按鈕的速度很慢,嚴重影響了軟體的使用體驗。於是將生成按鈕的操作放到子執行緒中。一開始我是直接在子執行緒中生成按鈕來更新UI的,

安卓4.0以後主執行訪問網路問題(NetworkOnMainThreadException)解決方法執行更新ui

安卓4.0之後谷歌建議不在主執行緒訪問網路,可能是因為訪問網路可能會等待時間長造成假死現象,解決辦法無非是強行訪問和開一個子執行緒訪問 1.強行訪問: 在activity裡面onCreate方法裡面加

【iOS沉思錄】iOS執行更新UI到主執行的三種方法

簡單說將程式碼同步到主執行緒執行的三種方法如下: // 1.NSThread [self performSelectorOnMainThread:@selector(updateUI) withObject:nil waitUntilDone:NO];

[轉]C#執行更新UI控制元件的方法例項總結

[我的評論:之前專案做的C#客戶端對於多執行緒修改UI使用的就是這個,找了好些時間才找到,其他很多都是沒有再函式中直接使用Action<>放置delegate的,而是在全域性下先放一個delegate的宣告,很頭疼,特轉] [來源:http://www.jb51

執行更新ui相關

1.Android載入view有兩種方式:一是setContentView,二是inflater.inflate() 2.子執行緒其實是可以更新ui的,需要viewRoot,ViewRoot本質是一個Handler,作用是建立View與WindowsManger的通訊。通過Windowmanag

Android複習之旅--執行更新UI

Android4.0版本後耗時的操作(比如請求網路,下載檔案等)不能在UI主執行緒執行,而且子執行緒也不能直接更新UI介面。而現實的場景確是子執行緒在下載檔案的同時UI介面能顯示相應的進度資訊,既然有了需求,那肯定就會有解決方案。 Android提供了Handler訊息機制和Asyn

Android 執行更新UI【通過RunOnUI】

在Fragment中無法直接使用runonuithread   runOnUiThread這個方法只存在於Activity中,想用它必須獲取Activity的例項。   MainActiivty.this.runOnUiThread(),就沒問

Android 執行更新UI 異常

眾所周知,Android是不可以在子執行緒中直接更新UI的,需要藉助Handler或者View.post(Runnable runnable)或者runOnUIThread(Runnable runnable)將更新的程式碼切入到主執行緒中去實現UI更新。 我們來試一下,在Activity的 onCreat

Android在執行更新UI方式總結

1.Handler方式 —————-複寫handler的handleMessage方式——————- //在UI執行緒中建立Handler物件 private Handler mHandler = new Handler(){ @Overrid

Python+PyQT5的執行更新UI介面

子執行緒裡是不能更新UI介面的,在移動端方面。Android的UI訪問是沒有加鎖的,多個執行緒可以同時訪問更新操作同一個UI控制元件。也就是說訪問UI的時候,android系統當中的控制元件都不是執行緒安全的,這將導致在多執行緒模式下,當多個執行緒共同訪問更新操作同一個UI控制元件時容易發生不可

C# WINFORM 執行更新UI

獲取當前執行緒  System.Threading.Thread.CurrentThread.ManagedThreadId //判斷是否建立控制代碼             if (this.IsHandleCreated)             {      

WPF自學筆記(四):執行更新UI(Dispatcher.BeginInvoke)

   在做WPF開發時,如果直接在子執行緒裡更新UI會報錯—–“呼叫執行緒無法訪問此物件,因為另一個執行緒擁有該物件。”,這是因為WPF禁止在非UI執行緒裡直接更新UI介面。 解決方案:   

Android開發——實現執行更新UI

Android中執行緒按功能分的話,可以分為兩個,一個是主執行緒(UI執行緒),其他的都是子執行緒 主執行緒不能執行那些耗時過長的程式碼或任務(執行耗時過長的程式碼會出現應用未響應的提示),所以都是使用子執行緒來執行耗時過長的程式碼,比如說下載檔案等任務 一般情況,子執行緒中執行過長的程式碼,都是需要進行更新

Qt執行如何更新UI,完整的程式碼示例,有圖有真相

      Qt涉及到大量的資料更新,影象處理,視訊編解碼時,在主執行緒直接進行會讓主執行緒阻塞,程式直接卡死,直達阻塞的部分完成,介面才更新,例如,我們需要在TextBrowser上迴圈顯示資料。        我需要點選【新增新行資料】,然後每隔1秒迴圈顯示資料,之

Android可以在執行更新(重新整理)UI---"假象"

有時候,我們線上程裡面需要彈框,然而在用Toast彈框後,會出一個Can't create handler inside thread that has not called Looper.prepare()  錯誤。。。。原因很簡單就是因為安卓介面更新的操作需要在主執行緒操作. 實現

Android中使用非同步執行更新UI檢視的幾種方法

在Android中子執行緒是不能更新ui的。 所以我們要通過其他方式來動態改變ui檢視, 1、runOnUiThreadactivity提供的一個輕量級更新ui的方法,在Fragment需要使用的時候要用getActivity.runOnUiThread開啟執行緒 這種方法最簡單,方便更新一些不需要判斷的

Android可以在執行更新(重新整理)UI---"假象"

有時候,我們線上程裡面需要彈框,然而在用Toast彈框後,會出一個Can't create handler inside thread that has not called Looper.prepare()  錯誤。。。。原因很簡單就是因為安卓介面更新的操作需要在主執行緒操

qt 執行對介面進行更新失敗

有個按鈕會根據適當時候變更圖片。 比如型別qq的線上離線狀態,如果檢測線上離線狀態的方法是在子執行緒中,那麼去改變按鈕的樣式會失效。 這個問題困擾了我2天,最後才發現是這麼回事。 解決方法: 可以在子執

更新UI的幾種方式?(執行UI執行有哪幾種通訊方式?)

handler sendMessage方式 private Handler handler = new Handler() { public void handleMessage(Message msg) {

SWT中非UI執行更新UI方法

有時用swt會需要在費時的操作後更新ui,如果直接在回撥函式裡更新,介面會卡死,另起一個執行緒更新,會出現異常。這時就可以用Display類中的asyncExec或者syncExec方法。 pub