醫(yī)院網(wǎng)站asp分銷系統(tǒng)
當(dāng)信號(hào)發(fā)出后,被連接的槽函數(shù)會(huì)自動(dòng)被回調(diào),類似觀察者模式,當(dāng)發(fā)生了感興趣的事件,某一個(gè)操作就會(huì)被自動(dòng)觸發(fā)。信號(hào)是由于用戶對(duì)窗口或控件進(jìn)行了某些操作,導(dǎo)致窗口或控件產(chǎn)生了某個(gè)特定事件,這時(shí)Qt對(duì)應(yīng)的窗口類會(huì)發(fā)出信號(hào)以此對(duì)用戶的挑選做出反應(yīng)。
信號(hào)的本質(zhì)是事件,按鈕單擊、雙擊、窗口刷新、鼠標(biāo)移動(dòng)、按下、釋放、鍵盤輸入。槽的本質(zhì)是類的成員函數(shù),其參數(shù)可以是任意類型的,槽函數(shù)和普通C++成員函數(shù)幾乎沒有區(qū)別,可以是虛函數(shù),也可以被重載,可以是公有、保護(hù)、??私有的,也可以被其他成員函數(shù)調(diào)用
唯一區(qū)別:槽可以與信號(hào)連接一起,每當(dāng)和槽連接的信號(hào)被發(fā)射時(shí),就會(huì)調(diào)用這個(gè)槽
在Qt中信號(hào)和槽函數(shù)都是獨(dú)立的個(gè)體,本身沒有任何聯(lián)系,但由于某種特性需求可以將二者聯(lián)系,在Qt中使用Qobject類中的connect函數(shù)進(jìn)行關(guān)聯(lián),一個(gè)信號(hào)可以連接多個(gè)槽,一個(gè)槽也可以被多個(gè)信號(hào)連接,信號(hào)可以連接信號(hào),此時(shí)前者的發(fā)射信號(hào)將導(dǎo)致后者的發(fā)射,信號(hào)的參數(shù)類型可以與槽的參數(shù)類型對(duì)應(yīng),信號(hào)的參數(shù)可以比槽的參數(shù)多,但不可以少,否則連接將失敗
connect(const Qobject *sender,&QObject::signal, const Qobject *receiver,&QObject::method)
QT5的連接方式:信號(hào)和槽函數(shù)的參數(shù)是函數(shù)指針
QT服務(wù)器51用8266連,手機(jī)用app連,然后數(shù)據(jù)共享,手機(jī)和Qt都能控制單片機(jī),Qt是把單片機(jī)的數(shù)據(jù)發(fā)給手機(jī),把手機(jī)的控制命令給單片機(jī)
sender:發(fā)送信號(hào)的對(duì)象
signal:屬于sender對(duì)象,信號(hào)是一個(gè)函數(shù),這個(gè)參數(shù)的類型是函數(shù)指針,信號(hào)函數(shù)地址
receiver:信號(hào)接收者
method屬于receiver對(duì)象,當(dāng)檢測(cè)到sender發(fā)出了signal信號(hào),receiver對(duì)象調(diào)用method方法,信號(hào)發(fā)出之后的處理動(dòng)作
sender和receiver兩個(gè)指針必須被實(shí)例化了,否則connect不會(huì)成功
使用connect函數(shù)相當(dāng)于做了信號(hào)處理動(dòng)作的注冊(cè),method槽函數(shù)本質(zhì)上一個(gè)回調(diào)函數(shù),調(diào)用的時(shí)機(jī)是信號(hào)產(chǎn)生了以后,調(diào)用是Qt框架來(lái)執(zhí)行的
connect函數(shù)可以有第五個(gè)參數(shù)第五個(gè)參數(shù)是連接類型,連接類型(Connection Type):指定信號(hào)和槽之間的連接方式,包括:AutoConnection(默認(rèn),自動(dòng)選擇最佳連接類型),DirectConnection(直接調(diào)用槽函數(shù)),QueuedConnection(排隊(duì)調(diào)用槽函數(shù)),BlockingQueuedConnection(阻塞式排隊(duì)調(diào)用),以及UniqueConnection(確保信號(hào)與槽之間的連接唯一)
一、標(biāo)準(zhǔn)信號(hào)與槽:Qt提供的標(biāo)準(zhǔn)類中都可以對(duì)某些特定事件進(jìn)行檢測(cè),當(dāng)用戶操作后事件被觸發(fā)類的內(nèi)部就會(huì)產(chǎn)生對(duì)應(yīng)的信號(hào),這些信號(hào)都是Qt類內(nèi)自帶的
QPushButton的信號(hào)和槽函數(shù)
槽函數(shù)在Public slots中,信號(hào)函數(shù)是在signals中,如果沒有signals,可以到基類查找是否有signals
使用:功能實(shí)現(xiàn)--點(diǎn)擊按鈕,窗口
[signal]void QAbstractButton::clicked(bool checked=false)//單擊按鈕發(fā)出的信號(hào)
[slot]bool QWidget::close()//關(guān)閉窗口的槽函數(shù)
Connect(ui->closewindow,&QPushButton::clicked,this,&MainWindow::close);
Connect()操作一般寫在窗口的構(gòu)造函數(shù)中,相當(dāng)于在事件產(chǎn)生之前在qt框架中先進(jìn)行注冊(cè)
二、自定義信號(hào)與槽:需要將信號(hào)或槽函數(shù)放在一個(gè)自定義類中,自定義的類必須繼承QObject或QObject的子類,在定義類中頭文件加入QBject宏
信號(hào)本身是事件,只不過信號(hào)對(duì)應(yīng)的函數(shù)只有聲明,沒有定義
自定義信號(hào)的要求:
1、信號(hào)是類的成員函數(shù)
2、返回值是void
3、信號(hào)用signals聲明
如:class myWindow:public QObject{
???????Q_OBJECT
????signals:
???????void mysignal();//信號(hào)的參數(shù)作用是傳遞給槽函數(shù)
???????void mysignal(int a);
自定義槽函數(shù):信號(hào)的處理動(dòng)作可以當(dāng)作普通的成員函數(shù)使用,槽函數(shù)的參數(shù)是用來(lái)接收信號(hào)傳遞的數(shù)據(jù),信號(hào)傳遞的數(shù)據(jù)就是信號(hào)的參數(shù),信號(hào)函數(shù)和槽函數(shù)的參數(shù)類型需要進(jìn)行匹配
信號(hào)函數(shù):void my_slots(int a);
槽函數(shù):void my_signals(int a);
信號(hào)的參數(shù)可以大于等于槽函數(shù)的個(gè)數(shù)
Public slots:
private slots:這樣的槽函數(shù)不能在類外部調(diào)用
Protected slots:不能在類外部調(diào)用
Class clock:
public Object{Q_OBJECT;Signals:Void alarn();
}
個(gè)人類:
Class me:
Public Object{Q_OBJECT;
Public slots:Void DO(){
//槽函數(shù)
qDebug()<<”起床”;
}
}
QMainWindow類:
Class MainWindow:public QMainWindow{Q_OBJECT;
Public:Explicit MainWindow(QWidget *parent=nullptr);~MainWindow();
Public slots:Void m_trigger(){c->alarm();
}
Private:Ui::MainWindow *ui;me* m;my_clock* c; QMainWindow的構(gòu)造函數(shù):
MainWindow::MainWindow(QWidget *parent):QMainWindow(parent);Ui(new Ui::MainWindow){Ui->setupUi(this);m=new me;c=new my_clock();
//點(diǎn)擊按鈕發(fā)出的click信號(hào),被QMainWindow接收,觸發(fā)m_trigger槽函數(shù)
//m_trigger槽函數(shù)中觸發(fā)my_clock發(fā)送alarm信號(hào)
//me接收到alarm信號(hào),觸發(fā)Do槽函數(shù),打印起床做飯
connect(ui->button,&QPushButton::clicked,this,&MainWindow::m_trigger);
connect(c,&my_clock::alarm,m,&me::Do);
class Me:QObeject{Q_OBJECT;Public:void eat(){qDebug()<<“我要吃面”;}
void eat(QString s){qDebug()<<“我要吃”<<s;}signals:void hungry();void hungry(QString s);};me m;connect(m,SIGNAL(hungry()),m,slot(eat()));connect(m,SIGNAL(hungry(QString)),m,slot(eat(QString)));QT5:connect(&m,m_slot,&m,m_signal);//連接
信號(hào)與槽機(jī)制特點(diǎn):
松耦合:
信號(hào)和槽之間不需要顯式的引用或依賴關(guān)系。
發(fā)送信號(hào)的對(duì)象不需要知道哪些對(duì)象接收了該信號(hào)。
接收信號(hào)的對(duì)象也不需要知道信號(hào)是由哪個(gè)對(duì)象發(fā)出的。
靈活性:
一個(gè)信號(hào)可以連接多個(gè)槽,實(shí)現(xiàn)一對(duì)多的通信。
一個(gè)槽也可以響應(yīng)多個(gè)信號(hào),實(shí)現(xiàn)多對(duì)一的通信。
信號(hào)和槽的連接可以在運(yùn)行時(shí)動(dòng)態(tài)建立或斷開。
類型安全:
Qt的信號(hào)和槽機(jī)制在連接時(shí)會(huì)檢查參數(shù)類型是否匹配。
如果參數(shù)類型不匹配,連接將失敗,并在運(yùn)行時(shí)給出警告。
線程安全:
Qt的信號(hào)和槽機(jī)制支持跨線程通信,并保證線程安全。
信號(hào)可以在一個(gè)線程中發(fā)出,槽函數(shù)可以在另一個(gè)線程中執(zhí)行。
三、實(shí)現(xiàn)方式
聲明信號(hào)和槽:
在QObject派生類的頭文件中,使用signals關(guān)鍵字聲明信號(hào)。
使用slots關(guān)鍵字聲明槽函數(shù)。
連接信號(hào)和槽:
使用QObject::connect函數(shù)將信號(hào)連接到槽。
連接可以在應(yīng)用程序代碼中的任何地方完成,將發(fā)出信號(hào)的對(duì)象和接收信號(hào)的對(duì)象作為參數(shù)傳遞。
發(fā)射信號(hào):
當(dāng)某種條件滿足時(shí),在合適的地方使用emit關(guān)鍵字調(diào)用信號(hào)。
信號(hào)函數(shù)可以像普通函數(shù)一樣調(diào)用,并傳遞參數(shù)給槽函數(shù)。