2008-09-19 10 views
4

QTreeView에서 끌어서 놓기를 사용하는 Windows/Linux Qt 4.3 응용 프로그램이 있습니다. 동일한 Qt 라이브러리 집합을 사용하는 두 개의 매우 유사한 응용 프로그램이 있습니다. 끌어서 놓기는 Linux에서나 Windows에서는 하나에서만 작동합니다.Q 드래그하는 동안 끊어진 드래그

QDrag 개체가 작동하지 않는 응용 프로그램에서는 마우스를 움직이 자마자 삭제됩니다. 드래그 중에 여전히 Qt에서 처리되는 이벤트 큐에서 DeferredDelete 이벤트에 의해 삭제됩니다. 나는 QDrag 객체가 조기에 삭제되는 것을 보는 방법을 모른다.

이 문제를 디버깅하는 좋은 방법을 알 수 없습니다. 나는 출처를 비교해 보았고 명백한 것을 발견 할 수 없었다. 나는 다른 응용 프로그램에서 응용 프로그램 중 하나에서 코드를 사용하여 시도했다.

제안 사항?

업데이트 : 호출이 :: QDrag에 DoDragDrop하는 간부가 즉시 반환 있도록 COM이 성공적으로 초기화되지 않았기 때문에 실패 QDrag 작업이

이유. QApplication은 qt_init에서 OleInitialize를 호출하여 COM을 초기화하려고 시도했지만 "설정 한 후에 스레드 모드를 변경할 수 없습니다"라는 오류로 실패했습니다.

재미있는 점은 OleInitialize가 메인에서 수행되는 첫 번째 작업 일 때도 발생하므로 스레드 모드가 초기에 일부 외부 종속성에 의해 설정된다는 점입니다. Windows에서 작동하는 응용 프로그램 간의 차이점 중 하나는 실패한 것도 .NET 코드를 포함하므로 문제 일 수 있습니다.

는 해결 :

이 문제는 COM/CLR의 상호 운용성 문제입니다. CLR은 초기화 할 때 아파트 상태를 MTA로 설정하고 Qt가 COM을 초기화하려고 시도하면 실패합니다. 이 문제와 이전 솔루션은 Adam Nathan에 의해 Gotcha with STAThreadAttribute and Managed C++에서 논의됩니다. Visual Studio 2005에서는 구성 속성> 링커> 고급에/CLRTHREADATTRIBUTE : STA 컴파일러 옵션을 설정하여 새 진입 점을 만들지 않고도 스레딩 특성을 STA로 설정할 수 있습니다.

+0

, Qt의 이벤트 루프가 > 차단 잠시 동안 조작. 그런 일은 일어나지 않아야 할 것 같습니다 ... 죄송합니다. 아마도 도움이되지 않을 것입니다. –

답변

1

이 문제의 원인은 모르겠지만 QDrag를 서브 클래 싱하여 deleteLater()를 덮어 씁니다. (글쎄, 다시 구현해야하지만 슬롯이므로 어쨌든 호출됩니다.) 대신이 코드를 사용하십시오. QDrag를 만들고 deleteLater()에 중단 점을 넣습니다. Windows에서 http://doc.trolltech.com/4.3/qdrag.html >에서 QDrag :: 간부에 대한 Qt는 4.3 문서를 보면

관련 문제