2013-04-11 55 views
0

我的GUI由LineEditPushButton組成。當點擊PushButton時,槽位clicked()被調用。我想設置一個clicked()作爲信號和doSomething()作爲插槽之間的信號槽關係。問題是doSomething()無法訪問UI,doSomething()依賴於LineEdit的文本正常工作。如何通過信號和插槽傳遞參數?

我看到兩個解決方案:

  1. 格蘭特DoSomething的()獲取UI。

  2. 我想能夠通過一個QString doSomething()作爲參數。 clicked()不接受任何參數。 Qsignalmapper可能是我正在尋找的。但是,似乎映射器只根據信號是什麼傳遞參數。因此,論據需要事先進行設置,似乎在這裏沒有幫助。

我該怎麼辦解決方案2?

回答

1

假設一個C++溶液,則可以考慮使用像#2以下的中間信號:

connect(thisWidget, SIGNAL(clicked()), 
     thisWidget, SLOT(slotClickHandler())); 

然後:

void slotClickHandler() 
{ 
    QString s = "my variable string here"; 

    emit sigDoSomething(s); 
} 

和它們:

void slotDoSomething(const QString &s) 
{ 
    // Do something interesting with s here 

} 

注這段代碼假設你已經定義了一個新的信號sigDoSomething(const QString &)和一個專用插槽void slotDoSomething(const QString &)

+0

太棒了!你會說哪個更清潔?方法1或方法2?這取決於,對嗎?方法2的問題在於複製信號/插槽的數量在處理很多GUI元素時會變得混亂,對嗎?另外,爲什麼它是const QString&s?它不應該只是QString? – user2268490 2013-04-11 02:48:49

+0

正如你所說,這是「更清潔」的依賴。清潔劑是什麼意思?更容易閱讀?更容易調試?編譯器更容易?開發人員通常是最薄弱的環節,因此偏見「更清潔」。將信號和插槽清楚地映射到它們各自的小部件(使用有意義的名稱等)。讓QT moc和gcc擔心電話的數量。無論如何,簡單的鏈接函數調用可能會進行優化。最後,看似重複的呼叫將取決於您的實施:有多少個按鈕?他們究竟需要傳達什麼>?等。 – Throwback1986 2013-04-11 03:09:08

+0

至於const QString&,我假設插槽實現不需要修改QString。如果是這樣,通過值傳遞(即QString s)將會生成QString對象的不需要的副本。另一方面,通過引用傳遞QString(QString&)允許編譯器傳遞更高效的引用(本質上是指向對象的指針)。添加const限定符可以確保編譯器知道QString不會被修改。 (事實上​​,如果你試圖修改一個const對象,編譯器會聲明一個錯誤)。 – Throwback1986 2013-04-11 03:14:43