Qt 4.7+Xlib在QWidget::winId()方法上崩溃



很抱歉我的英语不好,但我有下一个问题。我正在使用Qt 4.7Xlib编写一个窗口管理器。我有类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;
}

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

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

为了用C和c++等低级语言编程,必须学习如何做这些事情

问题解决!我将这两个字符串粘贴在QApplication::exec()

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

最新更新