我有一个基于原始XLib的现有(大型)X应用程序。我想使用Qt 4为这个应用程序添加额外的窗口。这是最好的方法吗?
到目前为止的研究:
(如果对细节很重要,我现在正在看Qt 4.7.4。)
我现有的应用程序在循环中调用XtAppNextEvent
来处理其事件。我希望做的是用基于Qt的事件循环替换此事件循环,让Qt处理自己的事件,并为非Qt事件调用XtDispatchEvent
。
我找到了处理X事件的Qt部分(src/gui/kernel/qapplication_x11.cpp
,QApplication::x11ProcessEvent
)。我相信这个功能的关键部分是:
QETWidget *widget = (QETWidget*)QWidget::find((WId)event->xany.window);
确定事件是否引用Qt知道的窗口。对于非Qt窗口,返回NULL
。在此之后有几个处理异常,然后是一个块:
if (!widget) { // don't know this windows
QWidget *popup = QApplication::activePopupWidget();
if (popup) {
// ... bunch of stuff not involving widget ...
}
return -1;
}
我希望此时会有一个事件回调被调用非Qt相关的窗口事件,所以我可以在我的派生QApplication
中简单地实现一个虚函数并继续应用程序的现有事件处理。我可以添加这样的功能并重建Qt,但如果可能的话我宁愿避免这种情况。
我是否在正确的轨道上,或者可能有更好的方法?
我发现现有的问题与此类似,但它们都适用于Windows(MFC或.NET)。这是X特有的。
答案 0 :(得分:1)
我最终得到的解决方案是找到Qt Motif Extension的副本(Digia不再提供该副本,因为它现在不受支持,但您仍然可以找到{{1}的副本})。在那里,qtmotifextension-2.7-opensource.zip
和qtmotif.h
模块显示如何创建一个qtmotif.cpp
来处理Xt / Motif和Qt组件的X事件。