2016-07-04 1 views
1

У меня есть QLineEdit, который я хочу подключить к QLabel, чтобы в зависимости от действительности введенного текста. У меня есть две проблемы при этом.Qt Слоты и сигналы. Get Slot Receiver Object

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. Там нет CheckValidity слота QLabel (почему buttonQLabel?). Проверьте окно вывода отладчика после попытки подключения.
  2. QObject::sender() + литье. Литой может быть dynamic_cast или qobject_cast, посмотрите их разницу в Qt Assistant.
0

Если вы хотите, чтобы предоставить дополнительные аргументы в свой слот вызова, вы можете использовать лямбда вместо слота:

QObject::connect(text, &QLineEdit::textEdited, [=](const QString &text) { checkValidity(button, text); }); 
Смежные вопросы