2010-02-01 115 views
1

我有一系列QTextEdits和QLineEdits通过QSignalMapper(它发出一个textChanged(QWidget *)信号)连接到一个插槽。当连接槽被调用(粘贴在下面)时,我需要能够区分这两者,因此我知道是否调用text()或toPlainText()函数。确定QWidget的子类型的最简单方法是什么?确定Qt中的对象类型

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

其实,你的解决方案已经差不多了。实际上,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 
} 
+0

谢谢你,伟大工程! – 2010-02-01 08:16:57

4

你也可以用发送者>元对象() - >类名(),所以你不会让unnecesary转换。特别是如果你有很多课程要测试。该代码将是这样的:

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 
} 

我所知道的是一个老问题,但在我离开这个答案,以防万一这将是为别人有用......

相关问题