Determinazione tipi di oggetti in Qt
Domanda
Ho una serie di QTextEdits e QLineEdits collegati ad una fessura attraverso un QSignalMapper (che emette un TextChanged (QWidget *) del segnale). Quando la fessura collegato viene chiamato (incollato sotto), ho bisogno di essere in grado di distinguere tra i due in modo so se chiamare la funzione di testo () o toPlainText (). Qual è il modo più semplice per determinare il tipo sottoclasse di un QWidget?
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
{
...
}
}
Stavo considerando utilizzando try-catch, ma Qt non sembra avere molto ampio supporto per Eccezioni ... Tutte le idee?
Soluzione
In realtà, la soluzione è già quasi arrivati. In realtà, qobject_cast
tornerà NULL
se non è possibile eseguire il cast. Così provarlo su una delle classi, se si tratta di NULL
, provare dall'altra:
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
}
Altri suggerimenti
È inoltre possibile utilizzare Stato emittente> metaObject () -> className () in modo da non fare calchi finanziari inutili. Specialmente se si hanno un sacco di classi per test. Il codice sarà simile a questo:
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
}
Lo so è una vecchia questione, ma lascio questa risposta solo nel caso in cui sarebbe utile per qualcuno ...