1

我有一系列 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 似乎对异常没有非常广泛的支持......有什么想法吗?

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 回答