2011-01-12 4 views
0

타사 비 Qt Windows 응용 프로그램과 통합해야하는 DLL에 Qt 응용 프로그램이 있습니다. 필자는 타사 응용 프로그램을 소유하고 있지 않으므로 핵심 이벤트 처리 메커니즘을 변경할 수 없습니다 (일부 경우 소스가 없음). 이 일을하는 가장 좋은 방법은 무엇입니까?타사 응용 프로그램 내 Qt 플러그인 응용 프로그램

QtWinMigrate 프레임 워크를 시도했지만 CWinApp :: Run을 변경할 수 있습니다. 수행 할 수 없습니다. QApplication을 작성하고 exec()를 호출하면 두 번째 이벤트 루프가 작성됩니다. 이러한 종류의 작업, 그러나 비 Qt 응용 프로그램 이벤트 중 일부는 이제 불가사의하게 사라집니다 (예 : 툴팁 및 키보드 명령이 작동을 멈춤).

의견을 보내 주시면 감사하겠습니다. 감사.

답변

1

나는 이것을위한 깨끗한 해결책이 있다고 생각하지 않는다. (그러나 나는 틀릴 수도있다.)

어쨌든 QCoreApplication::setEventFilter을 사용하여 키 누름, 마우스를 가리 키는 등의 몇 가지 주요 이벤트를 잡아서 응용 프로그램 이벤트 루프에 공급할 수 있습니다. 못생긴 일이지만, 일을 끝내야 할 수도 있습니다.

QCoreApplication::setEventFilter은 다음 서명 기능을받습니다

Windows에서
bool myEventFilter(void *message, long *result); 

, messageMSG에 주조 정적이 될 수 있습니다. Windows API에 대한 지식은 어느 정도 녹슬었지만 관련 이벤트를 찾는 것은 어렵지 않습니다.

나는이 솔루션을 깊이 싫어한다는 점을 강조해야합니다. 나는 진심으로 Qt를 사용하지 않고 플러그인을 썼을 것이다. 그러나 아주 추악한 방법으로도 작동합니다.

+0

의견에 감사드립니다. 나는 이것을 조사해 내 예제 애플리케이션에서 작동했다. (QApplication 대신 QAbstractEventDispatcher 인스턴스에 필터를 설정해야했지만). 말할 필요도없이 프로덕션 환경이 훨씬 더 복잡해졌고 별도의 스레드에서 2 개의 이벤트 루프를 실행해야만했습니다 (2 개의 응용 프로그램 사이의 통신에주의를 기울여야합니다!). 감사. – Robin

+0

@Robin 전혀 없습니다. 새로운 Qt 코드를 MFC 레거시 애플리케이션과 통합하는 방법도 다루었습니다. 이런 종류의 솔루션의 문제점은 단일 이벤트 루프처럼 Qt 전제를 위반하고 매우 미묘하고 추적하기 어려운 버그를 생성 할 수 있다는 것입니다. 어쨌든 현실 세계의 문제는 현실 세계의 해결책을 필요로합니다. 행운을 빕니다 :) –

0

QtWinMigrate이이 문제의 올바른 해결 방법입니다. Win32 또는 MFC 이벤트 루프 문제에서 Qt를 해결합니다. 변경할 필요가 없습니다. CWinApp::Run

QMfcApp::pluginInstance은 Qt DLL이 MFC 이벤트 루프로 작업하는 데 필요한 것입니다. DllMain에서 설정했습니다 :

#include <Windows.h> 
#include "qmfcapp.h" 

BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpvReserved) 
{ 
    static bool ownApplication = false; 

    if (dwReason == DLL_PROCESS_ATTACH) { 
     ownApplication = QMfcApp::pluginInstance(hInstance); 
    } 
    if (dwReason == DLL_PROCESS_DETACH && ownApplication) { 
     delete qApp; 
    } 
    return TRUE; 
} 
관련 문제