QT如何将应用程序嵌入到QT小部件中

时间:2013-08-27 18:25:26

标签: c++ qt qwidget qx11embedcontainer

在我们的项目中,我们有三个独立的应用程序,我们必须开发一个控制这三个应用程序的QT控制应用程序。主窗口将分成三个子窗口 - 每个窗口显示另一个应用程序 我想使用QX11EmbedWidgetQX11EmbedContainer小部件,但有两个问题:

  1. QX11Embed *基于X11协议,我不知道它是否支持非x11系统,如Windows操作系统。
  2. 从QT 5开始,这些类不存在,QT文档没有提到原因。
  3. 所以我不知道是否使用它 - 我很乐意得到答案 另外,我看到QT 5.1包含QWidget::createWindowContainer();函数,在某些帖子中,它看起来应该是X11Embed的替代品。任何人都可以请更多地了解我如何使用此功能创建一个QT小部件,它将在其中运行另一个应用程序(例如计算器)?

    我在谷歌搜索了很多,但没有找到我的Q的答案 谁能帮帮我吗?我是在正确的方式吗?
    谢谢!

2 个答案:

答案 0 :(得分:9)

如果所有三个独立的应用程序都是用Qt编写的,并且你有源代码,你应该能够通过Qt中的GUI对象的父对象来统一它们。

http://qt-project.org/doc/qt-4.8/objecttrees.html

http://qt-project.org/doc/qt-4.8/widgets-and-layouts.html

http://qt-project.org/doc/qt-4.8/mainwindows-mdi.html

如果您无法以这种方式访问​​它们,那么您所说的就像是第三方窗口管理。它有点像编写一个shell,比如Windows资源管理器,它可以操纵其他窗口应用程序的状态和大小。

使用类似Spy ++或AutoIt Spy for Windows的程序以及类似其他操作系统的程序,并学习您想要控制的窗口的识别标记,如类,窗口标题等。或者您可以启动exe你自己处于QProcess::startDetached()类的事情中。

http://qt-project.org/doc/qt-5.1/qtcore/qprocess.html#startDetached

然后使用OS相关的调用来控制窗口。 Qt库没有为第三方窗口内置的内容,仅适用于您启动的QApplication下的内容。 AutoHotKey或AHK有很多这样做的例子。它是一种脚本语言,用于在Windows环境中自动执行很多操作,并且还有适用于Mac的端口(虽然我自己没有尝试过mac端口)。

所以最后你正在寻找你的窗口可能是这样的一个电话:

#include <windows.h>

HWND hwnd_1 = ::FindWindow("Window_Class", "Window Name");
LONG retVal = GetWindowLongA(hwnd_1, GWL_STYLE); // to query the state of the window

然后像这样操纵窗口的位置和状态:

::MoveWindow(hwnd_1, x, y, width, height, TRUE);
::ShowWindow(hwnd_1, SW_SHOWMAXIMIZED);

如果为正在操作的窗口正确设置窗口标记,您甚至可以在控制的窗口上绘制窗口小部件。

transparent QLabel with a pixmap

Cannot get QSystemTrayIcon to work correctly with activation reason

在执行所有这些操作时出现在Windows中的一些问题是,当他们将显示缩放设置与您期望的不同时,以及如果您想要使用任务栏,并且和处理你正在操作的程序的所有模态窗口。

总的来说,它是可行的。 Qt将为执行这些命令提供一个很好的界面,但最后你会看到很多工作和调试,以便在一个漂亮,可靠的窗口管理器中实现它。

希望有所帮助。

答案 1 :(得分:7)

我自己从未尝试过,但是从Qt 5.1的文档中我会尝试QWindow :: fromId(WId id),它会给你一个QWindow,它应该可以用createWindowContainer嵌入:

   QWindow * QWindow :: fromWinId(WId id)[静态]创建一个本地   由另一个进程或使用创建的窗口的表示   Qt。以下的本地图书馆。

     

给定本机窗口的句柄ID,此方法创建QWindow   在调用方法时可用于表示窗口的对象   比如setParent()和setTransientParent()。可以使用它   支持它的平台,在容器内嵌入窗口或   在另一个进程创建的窗口顶部制作一个窗口。

但不保证。 : - )

相关问题