QT子執行緒與主線程的訊號槽通訊

2021-08-01 13:31:04 字數 3527 閱讀 4379

最近用qt做乙個伺服器,眾所周知,qt的主線程必須保持暢通,才能重新整理ui。所以,網路通訊端採用新開執行緒的方式。

在涉及到使用子執行緒更新ui上的控制項時遇到了點兒麻煩。

網上提供了很多同一執行緒不同類間採用訊號槽通訊的方式,但是並不完全適合執行緒間的訊號槽通訊,這主要體現在自定義訊息的傳遞上。

首先我們看看一般的方式:

testthread.h 檔案

[cpp]view plain

copy

print?

#ifndef testthread_h

#define testthread_h

#include 

#include "msg.h"

class

testthread : 

public

qthread  

;  #endif // testthread_h

testthread.cpp檔案

[cpp]view plain

copy

print?

#include "testthread.h"

testthread::testthread(qobject *parent) :  

qthread(parent)  

void

testthread::run()    

自己定義的類繼承了qthread類,重寫run函式,然後觸發testsignal訊號。

mainwindow.h

[cpp]view plain

copy

print?

#ifndef mainwindow_h

#define mainwindow_h

#include 

#include "testthread.h"

namespace

ui   

class

mainwindow : 

public

qmainwindow  

;  #endif // mainwindow_h

mainwindow.cpp

[cpp]view plain

copy

print?

#include "mainwindow.h"

#include "ui_mainwindow.h"

mainwindow::mainwindow(qwidget *parent) :  

qmainwindow(parent),  

ui(new

ui::mainwindow)  

void

mainwindow::displaymsg(

inta)  

mainwindow::~mainwindow()    

mainwindow裡面連線訊號槽,並且將收到的int引數顯示在介面上。

執行效果

下面我們對程式進行一些簡單,修改,使得它傳輸我們的自定義訊息。

testthread.h 檔案

[cpp]view plain

copy

print?

#ifndef testthread_h

#define testthread_h

#include 

#include "msg.h"

class

testthread : 

public

qthread  

;  #endif // testthread_h

testthread.h 檔案

[cpp]view plain

copy

print?

#include "testthread.h"

testthread::testthread(qobject *parent) :  

qthread(parent)  

void

testthread::run()    

mainwindow.h 檔案

[cpp]view plain

copy

print?

#ifndef mainwindow_h

#define mainwindow_h

#include 

#include "testthread.h"

#include "msg.h"

namespace

ui   

class

mainwindow : 

public

qmainwindow  

;  #endif // mainwindow_h

mainwindow.cpp 檔案

[cpp]view plain

copy

print?

#include "mainwindow.h"

#include "ui_mainwindow.h"

mainwindow::mainwindow(qwidget *parent) :  

qmainwindow(parent),  

ui(new

ui::mainwindow)  

void

mainwindow::displaymsg(msg msg)  

mainwindow::~mainwindow()    

此時再進行編譯,能夠通過,但是qt creator會有提示

[cpp]view plain

copy

print?

qobject::connect: cannot queue arguments of type 

'msg'

(make sure 'msg'

is registered 

using

qregistermetatype().)  

並且執行程式,不會有任何反應。

mainwindow.cpp檔案 改動為

[cpp]view plain

copy

print?

ui->setupui(

this

);  

qregistermetatype("msg"

);  

此時能夠正常執行

說明:

qt內生的元資料型別,如int double qstring 等

如果要用自己定義的資料型別,需要在connect前將其註冊為元資料型別。形式見**。

Qt執行緒間通訊 訊號與槽通訊

執行緒間通訊 1.自定義事件 postevent 2.訊號與槽 本質也是通過自定義事件實現的 注意 每個執行緒都有自己的事件迴圈 下面先說明下訊號與槽的通訊 下面這個程式的執行截圖 此程式的邏輯 主線程有乙個qprogressbar。有乙個子執行緒,把主線程裡面的qprogressbar傳入子執行緒...

Qt多執行緒基礎(三)子執行緒與主線程通訊

一 澄清概念 1.qt主線程 2.qt子執行緒 qt的子執行緒用於一些耗時操作,因此又被稱為工作執行緒。子執行緒不能用於直接重新整理介面 qwidget不可重入,qobject可重入 若子執行緒企圖修改介面控制項,可通過執行緒間通訊的方式 qt的訊號槽機制是跨執行緒的,因此可以用作執行緒間通訊。二 ...

QT中的多執行緒 與主線程通訊

今天回想研究生期間做的專案,用到了qt的多執行緒通訊,當時一點都不懂,就這照貓畫虎地寫,如今因為上次面試中問到了,覺得得好好準備下 主線程可以通過建立 qthread 子類物件開啟乙個新的執行緒,如果這些執行緒間需要相互通訊,它們可以使用共享變數,同時使用 mutexes,read write lo...