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?

War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top