RRR*_*RRR 9 c++ qt qwidget qx11embedcontainer
在我们的项目中,我们有三个独立的应用程序,我们必须开发一个控制这三个应用程序的QT控制应用程序.主窗口将分成三个子窗口 - 每个窗口显示另一个应用程序.
我想使用QX11EmbedWidget和QX11EmbedContainer小部件,但有两个问题:
所以我不知道是否使用它 - 我很乐意得到答案.
另外,我看到QT 5.1包含QWidget :: createWindowContainer(); 功能,在一些帖子中,它看起来应该是X11Embed的替代品.任何人都可以请更多地了解我如何使用此功能创建一个QT小部件,它将在其中运行另一个应用程序(例如计算器)?
我在谷歌搜索了很多,并没有找到我的Qs的答案.
谁能帮帮我吗?我是正确的吗?
谢谢!
如果所有三个独立的应用程序都是用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
Run Code Online (Sandbox Code Playgroud)
然后像这样操纵窗口的位置和状态:
::MoveWindow(hwnd_1, x, y, width, height, TRUE);
::ShowWindow(hwnd_1, SW_SHOWMAXIMIZED);
Run Code Online (Sandbox Code Playgroud)
如果为正在操作的窗口正确设置窗口标记,您甚至可以在控制的窗口上绘制窗口小部件.
在完成所有这些工作时,Windows中出现的一些问题是,当他们将显示器缩放设置与您的预期不同时,以及如果您希望与任务栏一起使用,并处理所有这些问题时,会发现Windows UI的怪癖.您正在操作的程序的模态窗口.
总的来说,它是可行的.Qt将为执行这些命令创建一个很好的界面,但最后你会看到很多工作和调试,以便在一个漂亮,可靠的窗口管理器中实现它.
希望有所帮助.
我自己从未尝试过,但是从Qt 5.1的文档中我会尝试QWindow :: fromId(WId id),它会给你一个QWindow,它应该可以用createWindowContainer嵌入:
QWindow*QWindow :: fromWinId(WId id)[静态]创建由另一个进程或使用Qt以下的本机库创建的窗口的本地表示.
给定本机窗口的句柄id,此方法创建一个QWindow对象,该对象可用于在调用setParent()和setTransientParent()等方法时表示窗口.这可以在支持它的平台上使用,将窗口嵌入容器内或在另一个进程创建的窗口顶部形成窗口.
但不保证.:-)