Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
QWidget::winId()方法上的Qt4.7+Xlib崩溃_Qt_Qt4_X11_Xlib_Xserver - Fatal编程技术网

QWidget::winId()方法上的Qt4.7+Xlib崩溃

QWidget::winId()方法上的Qt4.7+Xlib崩溃,qt,qt4,x11,xlib,xserver,Qt,Qt4,X11,Xlib,Xserver,对不起,我的英语不好,但我还有一个问题。我正在使用Qt4.7和Xlib编写一个窗口管理器。我的类管理器继承了QApplication,并在其中重新实现了方法X11EventFilter。在X11EventFilter方法中,我从XServer捕获必要的事件。当我收到MapRequest事件时,我捕捉到新窗口的出现,并将其重新复制到我自己的小部件中。当我创建小部件并调用QWidget::show或QWidget::winId方法时,程序崩溃。有什么问题 这里是一个小部件创建的方法。我想知道,当这个

对不起,我的英语不好,但我还有一个问题。我正在使用Qt4.7和Xlib编写一个窗口管理器。我的类管理器继承了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;
}

问题很可能存在于由/*某些代码*/表示的代码中。由于不知道存在什么,因此很难确定问题的确切原因。如果无法显示所有代码,则必须自己查找问题

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


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

问题解决了!我在QApplication::exec之前粘贴这两个字符串

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