2013-07-06 52 views

回答

2

您無法在connect()語句中傳遞參數。您需要一個設置標籤文本的「蹦牀」插槽(或者,在Qt 5中,您可以選擇使用拉姆達)。

例如,通過使用一個子類:

class MyLabel : public QLabel { 
    Q_OBJECT 
public slots: 
    void setTextToFoo() { setText("foo"); } 
}; 
// ... 
connect(button,SIGNAL(clicked()),label,SLOT(setTextToFoo()); 
+0

我嘗試定義一個子類,但仍然是錯誤的 –

+0

類MyLabel:公共QLabel { Q_OBJECT 公共插槽: 無效setTextToFoo(){的setText( 「富」); } }; MyLabel * ll; –

+0

「但仍然錯」*什麼是錯的? – peppe

0

這取決於你正在努力實現的,說實話到底是什麼,你所提供的示例代碼是不是很實用,是「DD」一個特定的靜態你正在使用的價值,或潛在的一些其他字符串?它來自哪裏,它是在被調用的範圍內,還是由調用者發送,這是向slot發送參數時的通常做法。

無論哪種方式,爲了創建連接語句,第一個要求是參數匹配,clicked()沒有參數,而setText()有一個,因此存在不匹配。至於如何解決這種不匹配問題,最簡單的方法是使用簡單的包裝器,儘管您可以使用QSignalMapper以及Qt5,lambdas和std :: bind。

對於初學者來說,你不能在connect語句中指定實際的參數實例,即使在參數兩邊你只需要指定幫助解決重載的類型(這對於Qt5中的新連接語法來說是很糟糕的),並且沒有任何實際的標識符或文字。

如果更常見的情況下,數據由調用方發送到插槽,標識符或文字將在emit signal(value)語句中指定。由於您沒有clicked(const QString &),您需要一個包裝插槽,您可以連接到clicked(),並使用該包裝插槽中的值發出或者按下子按鈕,並添加您自己的clicked(QString)過載。

如果值處於被調用範圍內,則子類化沒有多大意義,您需要的只是被調用對象範圍內的包裝器插槽。如果你想要更多,你將不得不使用Qt 5,它的語法更加強大。

+0

是的,他發佈的代碼不起作用,但這是關於它如何在提升中起作用。在boost中,你可能會做一些事情:'button.clickSignal。connect(boost :: bind(&QLabel :: setText,label,「dd」))'。 Boost允許您通過文字值定義參數。 –

+0

@TomášZato - 'std :: bind()'現在已經是C++的一部分了。 – dtech

+0

我從來沒有說過它不是,但你的回答只提到它,並不解釋如何處理它。這就是爲什麼我發佈評論,解釋我期望使用我知道的語法。 –

0

如果問題是什麼錯誤,請記住Signal和Slot的參數號必須相同。問一個同事,並根據Peppe,setText(QString)等待一個參數,並且Clicked()是空的...自定義的插槽是間接調用setText()方法。

你可以看看:http://qt-project.org/doc/qt-4.8/widgets-calculator.html 它使用QWidget,除QML外Qt接口的重要組成部分。

+0

感謝您的回覆。它已經解決了。 –

相關問題