2016-07-04 78 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); });