在我们的项目中,我们有三个独立的应用程序,我们必须开发一个QT控制应用程序来控制这三个应用程序。主窗口将被分离为三个子窗口--每个子窗口显示另一个应用程序。
我想使用QX11EmbedWidget和QX11EmbedContainer小部件,但是有两个问题:
因此,我不知道是否使用它-我会很高兴得到一个答案。
此外,我看到QT5.1包含QWidget::createWindowContainer();函数,在某些帖子中,它看起来应该是X11Embed的替代品。有谁能更详细地解释一下吗?我如何使用这个函数创建一个QT小部件,在它的内部运行另一个应用程序(例如计算器)?
我在谷歌上搜索了很多,没有找到我的问题的答案。
有人能帮帮我吗?我在正确的道路上吗?
谢谢!
发布于 2013-08-27 19:05:09
如果这三个独立的应用程序都是用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 sort之类的程序,以及其他操作系统的类似程序,学习您想要控制的窗口的标识,如类、窗口标题等。或者您可以自己启动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);如果正确设置要操作的窗口的窗口标志,甚至可以在控制的窗口顶部绘制小部件。
transparent QLabel with a pixmap
Cannot get QSystemTrayIcon to work correctly with activation reason
在进行所有这些操作时,Windows中出现的一些问题是,当它们设置与您预期不同的显示缩放时,找出Windows UI的怪癖;如果您想对任务条进行友好的处理,并处理您正在操作的程序的所有模式窗口。
所以总的来说,它是可行的。Qt将为执行这些命令提供一个很好的界面,但最终您需要进行大量的工作和调试,才能在一个漂亮、可靠的窗口管理器中获得它。
希望这能有所帮助。
发布于 2013-08-27 19:03:54
我自己从未尝试过,但是在Qt5.1中的文档中,我会尝试QWindow::from id(WId id),它为您提供了一个QWindow,应该可以嵌入createWindowContainer:
QWindow * QWindow::fromWinId(WId id)静态创建一个由另一个进程创建的窗口的本地表示,或者使用Qt下面的本机库。 给定本机窗口的句柄id,此方法创建一个QWindow对象,该对象可用于在调用setParent()和setTransientParent()等方法时表示窗口。在支持它的平台上,这可以用于在容器中嵌入一个窗口,或者使一个窗口粘在另一个进程创建的窗口的顶部。
但不能保证。:-)
https://stackoverflow.com/questions/18472840
复制相似问题