gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 11:24:55 25 4
gpt4 key购买 nike

我有一个基于原始 XLib 的现有(大型)X 应用程序。我想使用 Qt 4 向此应用程序添加额外的窗口。执行此操作的最佳方法是什么?

目前的研究:

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

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

我找到了 Qt 中处理 X 事件的部分(在 src/gui/kernel/qapplication_x11.cppQApplication::x11ProcessEvent 中)。我认为此功能的关键部分是:

QETWidget *widget = (QETWidget*)QWidget::find((WId)event->xany.window);

确定事件是否引用 Qt 知道的窗口。对于非 Qt 窗口,这将返回 NULL。在此之后有几个处理异常,然后是一个像这样的 block :

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 特有的。

最佳答案

我最终得到的解决方案是找到 Qt Motif Extension 的拷贝(它不再直接从 Digia 获得,因为它现在不受支持,但您仍然可以找到 qtmotifextension-2.7-opensource.zip 的拷贝)。在那里,qtmotif.hqtmotif.cpp 模块展示了如何创建一个 QAbstractEventDispatcher 来处理 Xt/Motif 和 Qt 的 X 事件组件。

关于c++ - 如何将新的 Qt 窗口与现有的 X 应用程序集成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27030693/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com