1

QSignalMapper(textChanged(QWidget *)シグナルを発する)を介してスロットに接続された一連のQTextEditsとQLineEditsがあります。接続されたスロットが呼び出されたとき (下に貼り付けられています)、この 2 つを区別して、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 は例外を非常に広範囲にサポートしていないようです...何かアイデアはありますか?

4

2 に答える 2

4

実際、あなたのソリューションはすでにほとんどそこにあります。実際、キャストを実行できない場合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
}
于 2010-02-01T07:36:08.663 に答える
4

不要なキャストを行わないように、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
}

古い質問であることは知っていますが、誰かにとって役立つ場合に備えて、この回答を残します...

于 2013-08-02T19:24:07.517 に答える