确定Qt中的对象类型

时间:2010-02-01 07:28:23

标签: qtextedit qlineedit

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

2 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:4)

您还可以使用sender-&gt; metaObject() - &gt; 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
}

我知道这是一个老问题,但我留下这个答案,以防它对某人有用......