2014-02-19 79 views
0

有人可以幫助如何連接信號和插槽嗎?如何通過信號和插槽發送數據?

我有其中接收實時數據在其他功能我有可變功能1(一個值)

void function1(int,double) 
{ 
    if(condition) 
    { 
    //some code 
    numb3 = 100;// double numb3 received new data 
    emit mySignal(numb3); 
    } 
} 

然後應接收捕獲的值

void function2(int,double) 
    { 

    double parameter2 = numb3; 
    } 

我試圖組合像

Q_SIGNAL double mySignal(double newValue=0){return newValue;}; 
Q_SLOT double slot1(double param=0) {emit mySignal(param); }; 

and then in function2{ 
connect(customPlot,SIGNAL(mySignal()), qApp, SLOT(slot1())); 
double parameter2 = slot1();} 

但他們不工作,因爲我想。

在此先感謝!

+1

看看這裏:http://stackoverflow.com/questions/5842124/can-qt-signals-return-a-value –

+0

請標記哪個答案適合你更多 – darkgaze

回答

1

你應該在header中定義你的信號。

Q_SIGNAL: 

void mySignal(int); 

您的插槽在頭文件中看起來像下面所示。

Q_SLOT: 

void mySlot(int val); 

現在在cpp文件中,您可以將信號連接到如下所示的插槽。

connect(signalObject, SIGNAL(mySignal(int)),slotObject,SLOT(mySlot(int))); 
+0

好的,但如何處理一個參數哪個應該在信號和插槽之間發送? –

+0

@gen_next我寫了一個更完整的答案。 – darkgaze

0

你在混合C++'return'和Qt信號/槽。通常,信號和插槽具有返回類型void。另外,信號的主體由MOC生成,所以你通常只聲明它。

像這樣:

#include <QObject> 
#include <QDebug> 

class CustomPlot: QObject { 
    Q_OBJECT 

public: 
    void bla() { 
     emit doSomething(3.1415926535); 
    } 

signals: 
    void doSomething(double value); 
}; 

class EventHandler: QObject { 
    Q_OBJECT 

public slots: 
    void onDoSomething(double value) { 
     qDebug() << "we are called with value =" << value; 
    } 

}; 

//in main: 

CustomPlot plot; 
EventHandler handler; 

QObject::connect(&plot, &CustomPlot::doSomething, &handler, &EventHandler::onDoSomething); 

plot.bla(); // in QtCreator's 'Application Output' panel you'll see: 
      //we are called with value = 3.1415926535 
+0

嗨,謝謝,但在這個例子中,第一個函數bla()開始觸發發射信號。我需要爲這是由發射功能+插槽結果觸發結果插槽必須同時分配給雙賓語.... –

+0

對不起,我聽不懂你。看起來你只有5秒鐘來表達一切:)。 我不明白你爲什麼試圖讀取插槽的回報。槽通常返回無效。 如果沒有,當多個插槽連接信號時,您將如何處理這種情況?你將使用誰的回報價值? –

+0

再次說明:當涉及信號/插槽時,返回值幾乎總是無效的。當你想'返回'一些價值時,你傳遞這個值來表明,我。即調用'emit signal_name(value_to_return)'。因此,您可以將信號視爲「倒置」方法,其參數實際上是返回傳遞給連接插槽的值 –

2

定義發出信號的類的頭自定義信號:

signals: 
     void signalName(paramType1,paramType2...); 

定義你的插槽中的類接收信號,將收到:

public slots: 
     void slotName(paramType1,paramType2...) ; // Should be THE SAME parameter types 

現在連接在你想開始連接的cpp裏面:

connect(classObjectWhereTheSignalIs, SIGNAL(signalName(paramType1,paramType2)),classObjectWhereTheSlotIs,SLOT(slotName(paramType1,paramType2))); 

現在你發出這樣一個信號,只要你想:

emit (signalName(paramOfTypeParamType1, paramOfTypeParamType2...)); 

乾杯。