9

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

  1. QX11Embed* 基于 X11 协议,我不知道它是否支持 Windows 操作系统等非 x11 系统。
  2. 由于 QT 5 这些类不存在,并且 QT 文档没有提及原因。

所以我不知道是否使用它 - 我很乐意得到答案。
另外,我看到 QT 5.1 包含QWidget::createWindowContainer(); 在某些帖子中,它看起来应该是 X11Embed 的替代品。谁能告诉我更多我如何使用这个函数来创建一个 QT 小部件,该小部件将在其内部运行另一个应用程序(例如计算器)?

我在谷歌上搜索了很多,但没有找到我的 Qs 的答案。
谁能帮帮我吗?我走对了吗?
谢谢!

4

2 回答 2

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

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

使用 Spy++ 或 AutoIt Spy for Windows 之类的程序以及其他操作系统的类似程序,并了解您要控制的窗口的识别标记,如类、窗口标题等。或者您可以自己启动 exe 在QProcess::startDetached()那类的东西。

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

然后使用依赖于操作系统的调用来控制窗口。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);

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

带有像素图的透明 QLabel

无法使用激活原因使 QSystemTrayIcon 正常工作

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

所以总的来说,它是可行的。Qt 将为执行这些命令提供一个很好的界面,但最终您需要进行大量的工作和调试才能将其放入一个漂亮、可靠的窗口管理器中。

希望有帮助。

于 2013-08-27T19:05:09.203 回答
7

我自己从未尝试过,但从 Qt 5.1 的文档中我会尝试 QWindow::fromId(WId id),它为您提供了一个 QWindow,它应该可以嵌入 createWindowContainer:

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

给定本机窗口的句柄 id,此方法创建一个 QWindow 对象,当调用 setParent() 和 setTransientParent() 等方法时,该对象可用于表示窗口。这可以在支持它的平台上使用,将窗口嵌入到容器中,或者将窗口粘贴在另一个进程创建的窗口的顶部。

但不能保证。:-)

于 2013-08-27T19:03:54.347 回答