在QT4以上的版本,在窗體上用可以通過選中控件,然后點擊鼠標右鍵單擊按鈕,選擇“轉(zhuǎn)到槽”??梢宰詣觿?chuàng)建信號和槽。
選擇clicked(),并點擊 ok
Qt Creator會給頭文件和代碼文件自動添加 這個按鈕的單擊事件(信號和槽)。
不同的控件,信號不全是一樣的,根據(jù)控件的使用場景不同,包含的信號也不一樣。比如下拉列表框的信號和按鈕的不太一樣,沒有按鈕的單擊信號,只有選擇信號
以上是用QT新版本的特性來創(chuàng)建信號和槽。比較方便。
下邊我們來介紹自定義信號和槽的綁定。首先介紹connect函數(shù):
connect(信號發(fā)送者對象, 信號, 信號接收者對象, 槽, 信號和槽之間的連接模式)
connect??函數(shù)有5個參數(shù),其中第五個參數(shù)為信號和槽的連接模式,此參數(shù)有默認模式=AutoConnection。
enum ConnectionType {
AutoConnection,
DirectConnection,
QueuedConnection,
BlockingQueuedConnection,
UniqueConnection = 0x80
};
AutoConnection:自動連接,默認模式。連接類型會在信號發(fā)送時決定。如果接收者和發(fā)送者在同一個線程,則自動使用Qt::DirectConnection類型;如果接收者和發(fā)送者不在一個線程,則自動使用Qt::QueuedConnection類型。 DirectConnection:直接連接,槽函數(shù)會在信號發(fā)送的時候直接被調(diào)用,槽函數(shù)和信號發(fā)送者在同一線程。效果看上去就像是在發(fā)送信號的位置調(diào)用了槽函數(shù)。無論槽函數(shù)所屬對象在哪個線程,槽函數(shù)都在發(fā)射信號的線程內(nèi)執(zhí)行。 emit語句后面的代碼將在與信號關(guān)聯(lián)的所有槽函數(shù)執(zhí)行完畢后才被執(zhí)行。 QueuedConnection:隊列連接,信號發(fā)出后會暫時被放到一個消息隊列中,需等到接收對象所屬線程的事件循環(huán)取得控制權(quán)時才取得該信號,然后執(zhí)行和信號關(guān)聯(lián)的槽函數(shù),這種方式既可以在同一線程內(nèi)傳遞消息也可以跨線程操作。 emit語句后的代碼將在發(fā)出信號后立即被執(zhí)行,無需等待槽函數(shù)執(zhí)行完畢,槽函數(shù)在接收者所依附線程內(nèi)執(zhí)行。 BlockingQueuedConnection:槽函數(shù)的調(diào)用時機與Qt::QueuedConnection一致,區(qū)別在于發(fā)送者emit完信號后所在線程會阻塞,直到槽函數(shù)運行完畢。并且接收者和發(fā)送者絕對不能在一個線程,否則程序會死鎖。在多線程間需要同步的場合可能需要這個。 Qt::UniqueConnection:這個flag可以通過按位或(|)與以上四個結(jié)合在一起使用。當這個flag設(shè)置時,當某個信號和槽已經(jīng)連接時,再進行重復(fù)的連接就會失敗。也就是為了避免重復(fù)連接。
以下拉列表框控件QCombobox舉例,當下拉選項改變時,會觸發(fā)相關(guān)的槽:
// QT4 信號和槽最常用也是最常見的連接方式為使用:
connect(ui->comboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(currentIndexChanged(int))); connect(ui->comboBox, SIGNAL(currentIndexChanged(QString)), this, SLOT(currentIndexChanged(QString)));
以上代碼需要寫到窗體的構(gòu)造函數(shù)里
然后需要在頭文件中聲明
currentIndexChanged(int index)
currentIndexChanged(QString text)
然后在代碼文件中實現(xiàn)這兩個函數(shù)
以上的寫法是在Qt4中,使用SIGNAL和SLOT這兩個宏,將信號和槽轉(zhuǎn)成了字符串形式,是利用的字符串進行的匹配。如果信號和槽不匹配,編譯工程時是不會報錯的!
在Qt5版本中對信號和槽采用了新的方法:基于函數(shù)地址的強制類型轉(zhuǎn)換或重載,如果信號和槽的形參不匹配,在編譯時就會報錯:
connect(ui->comboBox, QOverload::of(&QComboBox::currentIndexChanged), this, [=](int index){
QMessageBox::information(this, "index", QString::number(index));
});
connect(ui->comboBox, &QComboBox::currentTextChanged, this, [=](const QString &text){
QMessageBox::information(this, "text", text);
});
上邊的定法中[]有以下三種用法,說明如下:
[] 空的捕獲列表,不會捕獲任何外部變更,也不能訪問任何外部變量
connect(button,&QPushButton::clicked,[](){
qDebug()
});
[=] 拷貝,外部變量以值傳遞,不能修改外部變量的值
int nCount = 0;
[=] 所有 [nCount] [=nCount]
[&]引用,可以修改外部變量的值
int nCount = 0;
connect(button,&QPushButton::clicked,[&](){ //也可以寫成[&nCount]
nCount ++;
qDebug()
});
?QOverload??是QT5.7版本之后才加入的,
語法格式:??QOverload::of(函數(shù)地址)??
作用:返回指定參數(shù)的重載函數(shù)。
QT5中的信號和槽的連接使用模板:
connect(
發(fā)送者對象,
static_cast(&發(fā)送者類名::信號函數(shù)名),
this,
static_cast(&接收者類名::槽函數(shù)名)
);
或
connect(
發(fā)送者對象,
qOverload::of(&發(fā)送者類名::信號),
this,
qOverload::of(&接收者類名::槽)
);
QObject::connect(m_test, QOverload::of(&FunctionTest::valueChangedflag),m_data, &Dataprocess::SignalOutputFlag);
這行代碼是用于在Qt中建立信號與槽的連接。信號valueChangedflag來自FunctionTest對象,它的參數(shù)類型是QString和bool。槽SignalOutputFlag來自Dataprocess對象。當valueChangedflag信號被觸發(fā)時,會調(diào)用SignalOutputFlag槽函數(shù)。
該連接的作用是將FunctionTest的信號與Dataprocess的槽函數(shù)進行關(guān)聯(lián),以便在valueChangedflag信號觸發(fā)時,通過調(diào)用SignalOutputFlag槽函數(shù)來處理相關(guān)邏輯。
請注意,根據(jù)代碼上下文和實際需求,m_test和m_data應(yīng)該是對象的指針或引用。此外,確保在連接信號與槽之前,F(xiàn)unctionTest和Dataprocess類都已正確定義和聲明。
QOverload::of(&FunctionTest::valueChangedflag) 是一個用于獲取成員函數(shù)指針的靜態(tài)函數(shù)模板。
在這里,QOverload 是一個模板類,提供了多個靜態(tài)成員函數(shù) of,用于獲取特定參數(shù)簽名的成員函數(shù)指針。QString 和 bool 是參數(shù)類型。FunctionTest::valueChangedflag 是一個信號函數(shù),它將被連接到槽函數(shù)。
通過使用 QOverload::of(&FunctionTest::valueChangedflag),可以在連接信號和槽時指定正確的參數(shù)類型,并確保信號函數(shù)與槽函數(shù)的參數(shù)匹配。
請注意, QOverload 類是 Qt 提供的用于信號和槽連接的輔助類,它提供了一種類型安全的方法來處理函數(shù)指針的重載問題。它允許在連接信號和槽時檢查參數(shù)類型的一致性,以避免潛在的編譯錯誤和運行時錯誤。
connect(comboBox, QOverload::of(&QComboBox::currentIndexChanged),[=](int index){
/* do ... */
});
《寫在最前邊》
《一、QT的前世今生》
《二、QT下載、安裝及問題解決(windows系統(tǒng))》
《三、Qt Creator使用》????
???????《四、Qt 的第一個demo-CSDN博客》
《五、帶登錄窗體的demo》
《六、新建窗體時,幾種窗體的區(qū)別》?文章來源:http://www.zghlxwxcb.cn/news/detail-803532.html
《七、Qt 信號和槽》????????文章來源地址http://www.zghlxwxcb.cn/news/detail-803532.html
到了這里,關(guān)于七、Qt 信號和槽的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!