안녕하세요 여러분!
최근에 개발 환경을 업그레이드했습니다. 즉, 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)
그럴
그러나 메소드를 오버로드하지 않았습니다. 오버로드 된 버전은 Q_OBJECT 매크로에 의해 자동으로 추가됩니다. 실제로 Qt 4 구현과 5 구현 간에는 차이점이 없습니다. 그리고 자식 클래스를위한 tr() 호출은 네 번째 버전에서 잘 작동했습니다. BTW에서는 문자열이 QObject :: tr()에 의해 변환됩니다. – Ivan