2011-09-21 2 views
0

죄송합니다. 제 영어는 유감이지만 다음 문제가 있습니다. 나는 Qt 4.7Xlib을 사용하여 창 관리자를 쓰고 있습니다. 내가 관리자응용 프로그램 상속하고 X11EventFilter 다시 구현 된 메서드가 있습니다. 에서 X11EventFilter 메서드는 XServer에서 필요한 이벤트를 잡습니다. MapRequest 이벤트를 받으면 새 창을 표시하고 내 위젯에 해당 창을 표시합니다. 그리고 그 위젯을 만들고 QWidget :: show() 또는 QWidget :: winId() 메서드를 호출하면 프로그램이 충돌합니다. 문제가 무엇입니까?QWidget :: winId() 메서드에서 Qt 4.7 + Xlib 충돌

다음은 위젯을 만드는 방법입니다. 이 함수가 프로그램을 시작할 때 몇 번이라도 호출하면 모든 것이 정상입니다. 여기

void Manager::createClientWindow(Qt::HANDLE pWinID) 
{ 
    QMWindowWidget *lWindowWidget = new QMWindowWidget(pWinID); 
    /*some code*/ 
    lWindowWidget->show();//crash is here 
    Qt::HANDLE widgetId = lWindowWidget->winId();//and here 
    /*some code*/ 
} 

createClientWindow 기능이 문제는 대부분 /*some code*/로 표시되는 코드에 상주

bool Manager::x11EventFilter(XEvent *pEvent) 
{ 
    switch(pEvent.type) 
    { 
    /*some code*/ 
    case MapRequest: 
    { 
     Qt::HANDLE lWindow = pEvent->xmaprequest.window; 

     QMWindowWidget* lWidget = findWidget(lWindow); 
     if (!lWidget) 
     { 
      lWidget = dynamic_cast<QMWindowWidget*>(QWidget::find(lWindow)); 
     } 

     if (lWidget) 
     { 
      XMapWindow(QX11Info::display(), lWindow); 
      lWidget->show(); 
      XRaiseWindow(QX11Info::display(), lWidget->winId()); 
      return true; 
     } 
     else 
     { 
      createClientWindow(lWindow);//here is where function is called 
      return true; 
     } 
    } 
    break; 
    /*some code*/ 
    } //switch 
    return false; 
} 

답변

0

문제가 해결되었습니다. 이 두 문자열을 붙여 넣기 전에 QApplication :: exec()

XClearWindow(QX11Info::display(), QX11Info::appRootWindow()); 
XSync(QX11Info::display(), false); 
0

호출되는 x11EventFilter 방법이다. 거기에 무엇이 있는지 모르기 때문에 문제의 정확한 원인을 정확히 찾아 내기가 어렵습니다. 모든 코드를 표시 할 수없는 경우 문제를 직접 추적해야합니다.

디버그 모드로 빌드하고 Qt의 디버그 버전과 링크해야합니다. 그런 다음 크래시가 발생하면 Qt 소스의 정확한 라인을보고 디버거로 깨진 데이터 구조를 분석하고 왜 깨 졌는지 알아 내려고 노력하십시오. 어쩌면 문제가있는 변수에 워치 포인트를 설정하고 어떤 코드가 유효하지 않은 값을 쓰는지 확인할 수 있습니다.

C 및 C++와 같은 저급 언어로 프로그래밍하려면이 작업을 수행하는 방법을 배워야합니다.

관련 문제