在我们的项目中,我们有三个独立的应用程序,我们必须开发一个控制这三个应用程序的QT控制应用程序。主窗口将分成三个子窗口 - 每个窗口显示另一个应用程序 我想使用QX11EmbedWidget和QX11EmbedContainer小部件,但有两个问题:
所以我不知道是否使用它 - 我很乐意得到答案 另外,我看到QT 5.1包含QWidget::createWindowContainer();函数,在某些帖子中,它看起来应该是X11Embed的替代品。任何人都可以请更多地了解我如何使用此功能创建一个QT小部件,它将在其中运行另一个应用程序(例如计算器)?
我在谷歌搜索了很多,但没有找到我的Q的答案
谁能帮帮我吗?我是在正确的方式吗?
谢谢!
答案 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()。可以使用它 支持它的平台,在容器内嵌入窗口或 在另一个进程创建的窗口顶部制作一个窗口。
但不保证。 : - )