【发布时间】:2023-04-08 04:26:01
【问题描述】:
对不起我的英语,但我有下一个问题。我正在使用 Qt 4.7 和 Xlib 编写一个窗口管理器。我有继承 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;
}
【问题讨论】: