2014-12-23 2 views
0

우선, 제 영어는 유감입니다.Windows에서 FireBreath로 QT 플러그인을 만드십시오

QT로 FireBreath 플러그인을 작성했으며 플러그인이 정상적으로 표시 될 수 있습니다.

하지만 플러그인 창에서 버튼을 클릭해도 아무 일도 일어나지 않았습니다. 그리고 모든 위젯은 이와 같습니다.

하지만 브라우저의 크기를 조정할 때 버튼이 변경되었습니다.

QT에서 이벤트 처리 또는 창 업데이트 작업을 잊어 버렸습니까?

어떤 조언을 주셔서 감사합니다!

QApplicationonPluginReady() 함수로 생성됩니다. (다음 m_playerQWidget 서브 클래스 주)

void MediaPlayerPlugin::onPluginReady() 
{ 
    static int argc=0; 
    static char **argv={ 0 }; 
    new QApplication(argc, argv); 
} 

그리고 QWidget 플러그인 윈도우의 자식입니다.

bool MediaPlayerPlugin::onWindowAttached(FB::AttachedEvent *evt, FB::PluginWindow *pluginWindow) 
{ 
    FB::PluginWindowWin* wnd = reinterpret_cast<FB::PluginWindowWin*>(pluginWindow); 
    HWND hwnd = wnd->getHWND(); 

    m_player = new MediaPlayer(); 

    HWND childHwnd = (HWND)m_player->winId(); 

    LONG oldLong = GetWindowLong(hwnd, GWL_STYLE); 

    ::SetWindowLong(hwnd, GWL_STYLE, oldLong | WS_CLIPCHILDREN | WS_CLIPSIBLINGS); 
    ::SetWindowLong(childHwnd, GWL_STYLE, WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS); 
    ::SetParent(childHwnd, hwnd); 


    FB::Rect pos = wnd->getWindowPosition(); 
    m_player->setGeometry(pos.left,pos.top,pos.right-pos.left,pos.bottom-pos.top); 
    m_player->show(); 
    return true; 
} 

답변

0

내 생각의 QApplication은 본질적으로 플러그인으로 실행하는 경우 문제가에서 실행되고있는 프로세스를 인수 할 것이라는 것을 할 것이다. 프로세스를 소유하지 않으므로 흥미로운 세부 사항을 결정할 필요가 없습니다.

짧은 대답은이를 수행 할 방법이 있다면 발견하지 못했다는 것입니다. 비슷한 일을해야하는 경우 QApplication 실행 파일을 별도의 프로세스로 실행하고 STDIN/STDOUT을 통해 통신했습니다.

+1

고마워, 난 내 문제를 해결했습니다. 그냥'onPluginReady()'함수에 다른 스레드를 만들고 스레드에서'QApplication'을 만듭니다. 그리고 이것은 내게 도움이되었습니다 - [링크] (http : // stackoverflow .com/questions/9777911/how-do-i-create-a-window-in-different-qt-threads) – zh220825