Die Bestimmung Objekttypen in Qt
Frage
Ich habe eine Reihe von QTextEdits und QLineEdits zu einem Schlitz verbunden durch eine QSignalMapper (die eine Textchanged (QWidget emittiert *) Signal). Wenn das angeschlossene Schlitz (klebte unten) aufgerufen wird, muss ich der Lage sein, zwischen den beiden zu unterscheiden, damit ich weiß, ob der Text () oder toPlainText () Funktion aufzurufen. Was ist der einfachste Weg, um die Unterklasse Typ eines QWidget zu bestimmen?
void MainWindow::changed(QWidget *sender)
{
QTextEdit *temp = qobject_cast<QTextEdit *>(sender);
QString currentText = temp->toPlainText(); // or temp->text() if its
// a QLineEdit...
if(currentText.compare(""))
{
...
}
else
{
...
}
}
Ich erwäge mit Try-Catch aber Qt scheint nicht sehr umfangreiche Unterstützung haben für Ausnahmen ... Irgendwelche Ideen?
Lösung
Eigentlich ist Ihre Lösung schon fast da. In der Tat, qobject_cast
kehrt NULL
wenn es die Besetzung nicht durchführen kann. Also versuchen Sie es auf einer der Klassen, wenn es NULL
, versuchen Sie es auf der anderen Seite:
QString text;
QTextEdit *textEdit = qobject_cast<QTextEdit*>(sender);
QLineEdit *lineEdit = qobject_cast<QLineEdit*>(sender);
if (textEdit) {
text = textEdit->toPlainText();
} else if (lineEdit) {
text = lineEdit->text();
} else {
// Return an error
}
Andere Tipps
Sie können auch verwenden sender-> metaObject () -> classname (), so dass Sie nicht unnötigen Abgüsse machen. Besonders, wenn Sie eine Menge von Klassen zu testen. Der Code wird so aussehen:
QString text;
QString senderClass = sender->metaObject()->className();
if (senderClass == "QTextEdit") {
QTextEdit *textEdit = qobject_cast<QTextEdit*>(sender);
text = textEdit->toPlainText();
} else if (senderClass == "QLineEdit") {
QLineEdit *lineEdit = qobject_cast<QLineEdit*>(sender);
text = lineEdit->text();
} else {
// Return an error
}
ich weiß, ist eine alte Frage, aber ich lasse diese Antwort nur für den Fall wäre es für jemanden ...
nützlich sein