對不起,我的英語,但我有一個問題。我寫使用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;
}