我想獲得一個信號來調用某些參數的函數,如下面的例子。如何獲得一個信號來調用具有某些參數的函數?
QPushButton *yes = new QPushButton("Yes");
yes->connect(yes, SIGNAL(clicked()), NULL, SLOT(printf("You pressed a button")));
我該如何做到這一點?
我想獲得一個信號來調用某些參數的函數,如下面的例子。如何獲得一個信號來調用具有某些參數的函數?
QPushButton *yes = new QPushButton("Yes");
yes->connect(yes, SIGNAL(clicked()), NULL, SLOT(printf("You pressed a button")));
我該如何做到這一點?
它看起來效率很低,但您可以用連接到按鈕的QString
參數創建一個新信號。包含的文本將在您的發出呼叫中定義。
例如。
connect(yes, SIGNAL(clicked()), this, SLOT(emitHelloWorldText());
connect(this, SIGNAL(emitText(QString)), receiver, SLOT(dostuffWithText(QString)));
那麼你emitHelloWorldText
方法可以是這樣的
void emitHelloWorldText() {
emit emitText("Hello world");
}
那麼這可以通過你的接收機類
void doStuffWithText(const QString &text) {
不幸的是,插槽和信號必須有匹配的參數。如果你確實需要堅持使用這個接口,你可以創建一箇中間插槽來傳播接收到的信號,但是沒有真正的方法。
經常忽略的一個辦法扭轉信號被拾起/插槽關係是。您可以在接收槽中調用它以獲取QPushButton
(使用qobject_cast
)的句柄並從那裏獲取文本。或者,您可以使用QSignalMapper來增強信號。
儘管使用sender()永遠不是一個乾淨的解決方案,因爲它通過假設插槽中的某個發件人來打破解耦。 – 2012-02-23 09:09:55
@FrankOsterfeld因此,通過中介轉發插槽。就在另一個地方。 Qt信號和插槽機制只要您離開預定路徑就有點弱。 – pmr 2012-02-23 10:21:37
這太可怕了。下一步是'emitHelloWorld'實際上從GUI元素獲取一些文本。 – pmr 2012-02-23 00:17:05