Извините за мой английский, но у меня следующая проблема. Я пишу оконный менеджер, используя Qt 4.7 и Xlib . У меня есть класс Manager , который наследует QApplication и переопределенный метод X11EventFilter . В методе X11EventFilter я отлавливаю необходимые события из XServer. Когда я получаю событие MapRequest , я улавливаю появление нового окна и перезаписываю его в свой собственный виджет. И когда я создаю этот виджет и вызываю методы QWidget :: show () или 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;
}