【问题标题】:Qt 4.7+Xlib crash on QWidget::winId() methodQWidget::winId() 方法上的 Qt 4.7+Xlib 崩溃
【发布时间】:2023-04-08 04:26:01
【问题描述】:

对不起我的英语,但我有下一个问题。我正在使用 Qt 4.7Xlib 编写一个窗口管理器。我有继承 QApplication 的类 Manager 并在其中重新实现了方法 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 qt4 x11 xlib xserver


    【解决方案1】:

    问题很可能出在/*some code*/ 表示的代码中。由于不知道那里有什么,因此很难确定问题的确切原因。如果您无法显示所有代码,则必须自己跟踪问题。

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

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

    【讨论】:

      【解决方案2】:

      问题已解决!我在 QApplication::exec()

      之前粘贴了这两个字符串
      XClearWindow(QX11Info::display(), QX11Info::appRootWindow());
      XSync(QX11Info::display(), false);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多