Qt 槽和信号。获取插槽接收器对象
Qt Slots and Signals. Get Slot Receiver Object
我有一个 QLineEdit,我想将其连接到 QLabel,以便根据输入的文本的有效性。我在执行此操作时遇到两个问题。
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 更改标签的背景颜色。我如何获得标签的参考?它作为信号的接收器存在,但我想不出一种方法来引用它。
CheckValidity
不是 QButton
的插槽,它是在您自己的 class 中定义的自定义插槽(我假设是,因为您没有指定它)。
因此,将最后一行更改为:
QObject::connect(text, SIGNAL(textEdited(const QString &)), this, SLOT(CheckValidity(const QString &)));
如果你想知道发件人对象,使用qobject_cast
:
QLabel *sender_label = qobject_cast<QLabel*> (sender ());
QLabel
中没有CheckValidity
槽(为什么button
是QLabel
?)。尝试连接后检查调试器的输出 window。
QObject::sender()
+ 演员。 Cast可能是dynamic_cast
或qobject_cast
,看他们在Qt Assistant中的区别。
如果您想为插槽调用提供额外的参数,您可以使用 lambda 而不是插槽:
QObject::connect(text, &QLineEdit::textEdited, [=](const QString &text) { checkValidity(button, text); });
我有一个 QLineEdit,我想将其连接到 QLabel,以便根据输入的文本的有效性。我在执行此操作时遇到两个问题。
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 更改标签的背景颜色。我如何获得标签的参考?它作为信号的接收器存在,但我想不出一种方法来引用它。
CheckValidity
不是 QButton
的插槽,它是在您自己的 class 中定义的自定义插槽(我假设是,因为您没有指定它)。
因此,将最后一行更改为:
QObject::connect(text, SIGNAL(textEdited(const QString &)), this, SLOT(CheckValidity(const QString &)));
如果你想知道发件人对象,使用qobject_cast
:
QLabel *sender_label = qobject_cast<QLabel*> (sender ());
QLabel
中没有CheckValidity
槽(为什么button
是QLabel
?)。尝试连接后检查调试器的输出 window。QObject::sender()
+ 演员。 Cast可能是dynamic_cast
或qobject_cast
,看他们在Qt Assistant中的区别。
如果您想为插槽调用提供额外的参数,您可以使用 lambda 而不是插槽:
QObject::connect(text, &QLineEdit::textEdited, [=](const QString &text) { checkValidity(button, text); });