2014-09-18 6 views
2


안녕하세요 여러분!
최근에 개발 환경을 업그레이드했습니다. 즉, Qt 4.8.4와 MSVC 2010을 Qt 5.3.1과 MSVC 2013로 옮겼습니다. 제가 직면 한 문제는 내 응용 프로그램이 시작될 때 충돌하고 스택 추적으로 인해 일부가 초기화되는 동안 충돌이 발생한다는 것입니다. 정적 클래스 필드 나는 MyClass::tr() 방법은 결국 QMetaObject::tr()를 호출하는 것으로 나타났습니다과는 QMetaObject 인스턴스의 모든 필드가 NULL을 것으로 나타납니다 Qt를로 디버깅하는 동안MSVC 2013의 정적 변수 초기화시 충돌 발생

// header file 

class MyClass : QObject 
Q_OBJECT 
public: 
... 
private: 
    static const QString CLASS_NAME; 

// *.cpp file 

const QString MyClass::CLASS_NAME = MyClass::tr("FOO"); // crash when calling tr() 
const QString MyClass::CLASS_NAME = QObject::tr("FOO"); // but this works normally 

:
은 다음 예를 참조하십시오. 충돌은 그 중 일부를 참조 할 때 발생합니다.

우분투 14.04 및 Qt 5.2.1을 사용하는 다른 컴퓨터에서는 크래시가 재생되지 않습니다.

확실히 MyClass이라는 이름을 QObject으로 바꿀 수는 있지만 프로젝트는 63 개의 라이브러리로 구성되어 있으므로 가능한 번역 고문이 두려워요.

class QObject : 

    static QString tr (const char * sourceText, const char * disambiguation = 0, int n = -1) 

그럴

답변

1

음, 즉 가상 메도 테이블을 참조 할 수 없습니다 의미, 정적 기능입니다. (C++ static virtual members? 참조)

문제는 다음과 같습니다. 메서드를 오버로드 할 수 있지만 기본 개체에 대한 호출이 호출되지 않습니다. 매크로 Q_OBJECT이 어떻게 상호 작용하는지 확실하지 않습니다. 하지만 나중에 연결될 것이라고 생각합니다.

결과 QString이 QObject :: tr()을 사용하여 번역 되었습니까?

정상적으로 작동하는지 확인하지 않으십시오. 그것을 테스트해야합니다.

편집 :

참으로 그것은 단지 내가 아마이있을 수들이 Qt를 5로 번역 API의 물건을 변경 기억 Qt는 5.x의 영향을 미치지 만 http://qt-project.org/doc/qt-5/sourcebreaks.html

를 참조하십시오, 그것을 검사 일부 숨겨진 코드가 엉망입니다.

+0

그러나 메소드를 오버로드하지 않았습니다. 오버로드 된 버전은 Q_OBJECT 매크로에 의해 자동으로 추가됩니다. 실제로 Qt 4 구현과 5 구현 간에는 차이점이 없습니다. 그리고 자식 클래스를위한 tr() 호출은 네 번째 버전에서 잘 작동했습니다. BTW에서는 문자열이 QObject :: tr()에 의해 변환됩니다. – Ivan