2010-02-01 2 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는 Exceptions ...에 대한 매우 광범위한 지원을하지 않는 것 같습니다. 어떤 아이디어입니까?

답변

4

사실 솔루션은 이미 거의 다 있습니다. 실제로 캐스트를 수행 할 수없는 경우 qobject_castNULL을 반환합니다. 이 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

감사합니다, 좋은 작품! –

4

또한 사용할 수 있습니다 sender-> metaobject를() -> 클래스 이름() 그래서 당신은 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 
} 

나는이 오래된 질문입니다 알고 있지만 난 그냥 누군가에 유용 할 것입니다 경우이 답변을 남겨 ...