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?

È stato utile?

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 ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top