죄송합니다. 제 영어는 유감이지만 다음 문제가 있습니다. 나는 Qt 4.7과 Xlib을 사용하여 창 관리자를 쓰고 있습니다. 내가 관리자응용 프로그램 상속하고 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;
}