2017-12-04 20 views
0

, 나는 다음과 같습니다 Qt는 자체에서 런타임에 로그 메시지를 수신하고 Q_DECLARE_METATYPE(QHostAddress) 매크로 또는 qRegisterMetaType<QHostAddress>("QHostAddress") 클래스를 사용하여이 메시지의 원인을 해결하는 방법을 알고 있습니다.이 질문에 대한 내용은 아닙니다.QObject :: connect : Qt5에서 유형의 인수를 대기열에 넣을 수없는 코드에서 호출 위치를 정확히 나타낼 수 있습니까?</p> <blockquote> <p>QObject를 :: 연결 : 형의 인수를 대기 할 수 없습니다 'QHostAddress'</p> </blockquote> <p>나는 내 Qt5 응용 프로그램에서

내가 알고 싶은 것은 이 메시지를 트리거 한 내 코드에서 통화의 정확한 위치를 정확하게 나타낼 수 있습니까??

메시지에는 파일/줄 번호가 없으므로 Qt5 자체에서 디버거 중단 점을 설정할 수없는 것 같아서이 메시지의 원인을 찾을 수 없습니다.

+0

메시지 처리기를 설치하고 경고 메시지에 중단 점을 설정합니다. 나는 대답 할 것이다. – drescherjm

+0

실제로 나는 allready 메시지 처리기가 있고, 나는 과거에는 이것을했지만 그 못생긴 못했다! –

+0

여기에 하위 질문이 있습니다. https://stackoverflow.com/questions/47624759/can-i-set-a-breakpoint-inside-qt-itself –

답변

1

나는 메시지를 잡으려고 메시지 처리기를 만듭니다 주에서

다음
void myMessageHandler(QtMsgType type, const QMessageLogContext & logContext, const QString & msg) 
{ 
    Q_UNUSED(logContext); 

    switch (type) { 
    case QtDebugMsg: 
     std::cerr << qPrintable(QString("qDebug: %1").arg(msg)) << std::endl; 
     break; 
    case QtWarningMsg: 
     std::cerr << qPrintable(msg) << std::endl; 
     break; 
    case QtCriticalMsg: 
     std::cerr << qPrintable(QString("qCritical: %1").arg(msg)) << std::endl; 
     break; 
    case QtFatalMsg: 
     std::cerr << qPrintable(QString("qFatal: %1").arg(msg)) << std::end; 
      abort(); 

    } 
} 

메시지 처리기를 설치 :

int main() 
{ 
    qInstallMessageHandler(myMessageHandler); 

// rest of main 
} 

가 그럼 난 경고 경우에 중단 점을 설정합니다. 중단 점에 도달하면 경고를 트리거 한 코드 줄에 콜 스택 (callstack)을 걸어갑니다. 내 응용 프로그램 중 일부에서는 어설 션 (거짓) 대신 대신 중단 점을 설정하는 것을 잊지 않았습니다.