对不起,我的英语,但我有一个问题。我写使用Qt的4.7和的Xlib一个窗口管理器。我有类管理器继承QApplication和重新实现的方法X11EventFilter在它。在X11EventFilter方法我赶上从的XServer必要的事件。当我收到MapRequest事件,我抓住新出现的窗口,并重新设置父级,以我自己的小工具。当我创建一个小部件,并调用QWidget的::秀()或了QWidget :: winId()方法,程序崩溃。问题是什么?的Qt 4.7 + Xlib的碰撞上了QWidget :: winId()方法
这里是插件正在创建的方法。我想知道,当这个函数在程序开始时调用几次时,一切都正常。
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*/
}
这里是一个x11EventFilter方法,其中createClientWindow函数被调用
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;
}