2016-07-04 76 views
1

我有一個QLineEdit,我想連接到一個QLabel,以便根據輸入的文本的有效性。這樣做時我有兩個問題。Qt插槽和信號。獲取插槽接收器對象

QLineEdit *text = new QLineEdit(this); 
layout->addWidget(text, rowno, 0); 
QLabel *button = new QLabel(this); 
button->setStyleSheet("QLabel { background-color : green; color : white; }"); 
button->setAlignment(Qt::AlignCenter); 
button->setText("OKAY"); 
QObject::connect(text, SIGNAL(textEdited(const QString &)), button, SLOT(CheckValidity(const QString &))); 

這不會將QLineEdit所做的任何更改連接到我的自定義插槽。我無法弄清楚爲什麼! 也在自定義插槽中,我想根據傳遞的QString更改標籤的背景顏色。我如何獲得標籤的參考?它作爲信號的接收器存在,但我無法找出一個方法來引用它。

回答

1

CheckValidity不是QButton的插槽,它是在您自己的類中定義的自定義插槽(我假設,因爲您沒有指定它)。

所以,改變最後一行:

QObject::connect(text, SIGNAL(textEdited(const QString &)), this, SLOT(CheckValidity(const QString &))); 

如果你想知道發件人對象,使用qobject_cast

QLabel *sender_label = qobject_cast<QLabel*> (sender()); 
+0

我可以通過標籤的自定義插槽的說法?我相信QT信號和插槽需要有相同數量的參數,但是我需要將特定的標籤與特定的文本框連接起來,並且它們是由用戶在運行時動態創建的,因此我無法在課堂中保留對它的引用。 –

0
  1. 沒有在QLabel沒有CheckValidity插槽(爲什麼buttonQLabel?)。連接嘗試後檢查調試器的輸出窗口。
  2. QObject::sender() + cast。演員陣容可能是dynamic_castqobject_cast,看看他們在Qt助手中的區別。
0

如果你要提供額外的參數到您插槽調用,您可以使用拉姆達代替槽:

QObject::connect(text, &QLineEdit::textEdited, [=](const QString &text) { checkValidity(button, text); });