2011-09-21 272 views
0

对不起,我的英语,但我有一个问题。我写使用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; 
} 

回答

0

问题已解决!我粘贴这两个字符串之前QApplication :: exec()

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

的问题极有可能存在于由/*some code*/表示的代码。由于不知道那里有什么,因此很难确定问题的确切原因。如果你不能显示所有的代码,你将不得不自己跟踪问题。

您需要构建调试模式并链接到Qt的调试版本。然后,当发生崩溃时,查看Qt源的确切线,并使用调试器分析损坏的数据结构,并尝试找出它们为什么被破坏。也许设置一个有问题的变量的观察点,并找出哪些代码在那里写入一个无效值。

为了在C和C++等低级语言中编程,人们必须学习如何做这件事。