多個訊號對應單個槽的實現
阿新 • • 發佈:2019-01-29
利用多個訊號對應一個槽函式,這樣就不用每一個訊號都設一個槽函式那麼麻煩了。
假設定義個多個QLineEdit,要讀其中的數字:
首先在標頭檔案中定義一個槽函式:
private slots:
void on_val_returnPressed();
在相應的原始檔中連線訊號與槽函式:
connect(val_v,SIGNAL(returnPressed()),this,SLOT(on_val_returnPressed())); connect(val_w,SIGNAL(returnPressed()),this,SLOT(on_val_returnPressed())); connect(ia1,SIGNAL(returnPressed()),this,SLOT(on_val_returnPressed())); connect(ia2,SIGNAL(returnPressed()),this,SLOT(on_val_returnPressed())); connect(ia3,SIGNAL(returnPressed()),this,SLOT(on_val_returnPressed())); connect(ia4,SIGNAL(returnPressed()),this,SLOT(on_val_returnPressed())); connect(ia5,SIGNAL(returnPressed()),this,SLOT(on_val_returnPressed())); connect(ia6,SIGNAL(returnPressed()),this,SLOT(on_val_returnPressed())); connect(val_Sr,SIGNAL(returnPressed()),this,SLOT(on_val_returnPressed())); connect(val_Spr,SIGNAL(returnPressed()),this,SLOT(on_val_returnPressed()));
都對應的是on_val_returnPressed()函式。
重點時在槽函式中怎麼識別是哪個控制元件發出的訊號:
void ProRobotics::on_val_returnPressed() { QLineEdit *lEdit = dynamic_cast<QLineEdit*>(sender());//這裡dynamic_cast,用qobject_cast,static_cast都可,具體區別以後在說 if(lEdit == val_v) { QString sVd = val_v->text(); Vd = sVd.toFloat(); } if(lEdit == val_w) { QString sWd = val_w->text(); Wd = sWd.toFloat(); } if(lEdit == ia1) { QString sa1 = ia1->text(); a1 = sa1.toFloat(); } if(lEdit == ia2) { QString sa2 = ia2->text(); a2 = sa2.toFloat(); } if(lEdit == ia3) { QString sa3 = ia3->text(); a1 = sa3.toFloat(); } if(lEdit == ia4) { QString sa4 = ia4->text(); a4 = sa4.toFloat(); } if(lEdit == ia5) { QString sa5 = ia5->text(); a5 = sa5.toFloat(); } if(lEdit == ia6) { QString sa6 = ia6->text(); a6 = sa6.toFloat(); } if(lEdit == val_Sr) { QString ssigma_r = val_Sr->text(); sigma_r = ssigma_r.toFloat(); } if(lEdit == val_Spr) { QString ssigma_phi = val_Spr->text(); sigma_phi = ssigma_phi.toFloat(); } }