2016-07-04 13 views
1

Ich habe eine QLineEdit, die ich mit einem QLabel verbinden möchte, so dass abhängig von der Gültigkeit des eingegebenen Textes. Ich habe dabei zwei Probleme.Qt Slots und Signale. Get Slot Receiver Objekt

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 &))); 

Dies verbindet keine Änderungen in QLineEdit mit meinem benutzerdefinierten Steckplatz. Ich kann nicht herausfinden warum! Auch im benutzerdefinierten Steckplatz möchte ich die Hintergrundfarbe meines Labels je nach QString ändern. Wie bekomme ich eine Referenz für das Etikett? Es ist als der Empfänger des Signals vorhanden, aber ich kann keinen Weg finden, darauf Bezug zu nehmen.

Antwort

1

CheckValidity ist kein QButton Slot, es ist ein benutzerdefinierter Slot in Ihrer eigenen Klasse definiert (ich nehme an, da Sie es nicht angegeben haben).

So ändern Sie die letzte Zeile:

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

Wenn Sie das Senderobjekt wissen wollen, verwenden Sie qobject_cast:

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

Kann ich das Label als Argument in der benutzerdefinierten Schlitz passieren? Ich glaube, dass QT-Signale und Slots die gleiche Anzahl von Argumenten haben müssen, aber ich muss ein bestimmtes Label mit einem bestimmten Textfeld verbinden und sie werden dynamisch vom Benutzer zur Laufzeit erstellt, daher kann ich keinen Verweis darauf in meiner Klasse behalten. –

0
  1. Es gibt keine CheckValidity Schlitz in QLabel (warum button ist QLabel?). Überprüfen Sie das Ausgabefenster des Debuggers nach dem Verbindungsaufbau.
  2. QObject::sender() + Besetzung. Cast kann dynamic_cast oder qobject_cast sein, schauen Sie ihren Unterschied in Qt Assistant.
0

Wenn Sie weitere Argumente in die Slot-Aufruf versorgen möchten, können Sie Lambda anstelle eines Slot verwenden:

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