如何将新的Qt窗口与现有的X应用程序集成?

时间:2014-11-20 02:29:03

标签: c++ qt x11 event-loop

我有一个基于原始XLib的现有(大型)X应用程序。我想使用Qt 4为这个应用程序添加额外的窗口。这是最好的方法吗?

到目前为止的研究:

(如果对细节很重要,我现在正在看Qt 4.7.4。)

我现有的应用程序在循环中调用XtAppNextEvent来处理其事件。我希望做的是用基于Qt的事件循环替换此事件循环,让Qt处理自己的事件,并为非Qt事件调用XtDispatchEvent

我找到了处理X事件的Qt部分(src/gui/kernel/qapplication_x11.cppQApplication::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特有的。

1 个答案:

答案 0 :(得分:1)

我最终得到的解决方案是找到Qt Motif Extension的副本(Digia不再提供该副本,因为它现在不受支持,但您仍然可以找到{{1}的副本})。在那里,qtmotifextension-2.7-opensource.zipqtmotif.h模块显示如何创建一个qtmotif.cpp来处理Xt / Motif和Qt组件的X事件。