Определение типов объектов в Qt - PullRequest
1 голос
/ 01 февраля 2010

У меня есть серия QTextEdits и QLineEdits, подключенных к слоту через QSignalMapper (который испускает сигнал textChanged (QWidget *)). Когда вызывается подключенный слот (вставлен ниже), я должен иметь возможность различать два, так что я знаю, вызывать ли функцию text () или toPlainText (). Какой самый простой способ определить тип подкласса 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
   {
      ...
   }
}

Я подумывал об использовании try-catch, но Qt, похоже, не имеет широкой поддержки исключений ... Есть идеи?

Ответы [ 2 ]

4 голосов
/ 02 августа 2013

Вы также можете использовать sender-> metaObject () -> className (), чтобы не делать ненужных приведений. Особенно, если у вас есть много классов для тестирования. Код будет таким:

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
}

Я знаю, это старый вопрос, но я оставляю этот ответ на всякий случай, если он кому-нибудь пригодится ...

4 голосов
/ 01 февраля 2010

На самом деле, ваше решение уже почти там. Фактически, qobject_cast вернет NULL, если не сможет выполнить приведение. Так что попробуйте на одном из классов, если это NULL, попробуйте на другом:

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