我有一系列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提供非常广泛的支持......有什么想法吗?
答案 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
}
我知道这是一个老问题,但我留下这个答案,以防它对某人有用......