2011-09-21 40 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++等低級語言中編程,人們必須學習如何做這件事。