环境:Qt 5.9.1_msvc2015_64bit,Window 10.
为了实现在qt程序中打开Window上其他应用程序,并将其嵌入到qt程序中。
方法:获取外部程序的窗口句柄,调用
[static]QWindow *QWindow::fromWinId(WIdid)
函数创建QWindow,然后调用
[static]QWidget *QWidget::createWindowContainer(QWindow *window,QWidget *parent = Q_NULLPTR,Qt::WindowFlagsflags = Qt::WindowFlags())
创建一个QWidget即可。
关键之处在于如何获取窗口句柄。
我们都知道Windows编程中,可以通过FindWindow系列的函数获取HWND类型的窗口句柄(需要include windows.h头文件),HWND类型和Qt中的WId类型可以转换,所以通过FindWindow我们可以找到想要嵌入的窗口,不论是子窗口还是主窗口,即使是整个桌面也未尝不可。
下面贴一下效果图:
原程序:
这是嵌入之后的Qt程序:
可以看到,在这里标题栏和边框都消失了。很有意思的方法,好奇Qt是如何做到这种进程间的嵌套,这篇只是简单介绍,待我研究透彻再来给大家分享。
如果不需要嵌套窗口的话,Qt也提供了其他的方法,不需要如此复杂。像QDesktopServices类,可以打开本地应用程序(打开文件或网页时,自动选择默认的应用程序)。
一开始的目的,是想将office窗口显示到qt程序里面,采用的是activexQt模块,但activex的开发需要一定时间的积累,微软的东西比较难用,加上activex只能打开微软自家的东西(有待验证),而且如果以后不仅仅是显示office呢?所以干脆直接嵌套进程窗口,一劳永逸。
Qt是一个跨平台应用程序和UI开发框架。使用Qt只需一次性开发应用程序,无须重新编写源代码,便可跨不同桌面和嵌入式 *** 作系统部署这些应用程序。Qt原为奇趣科技公司(Trolltech,www.trolltech.com)开发维护,已被nokia公司收购,在nokia的推动下,Qt的发展非常快速,版本不断更新。目前最新的Qt主版本为4.8.1,所支持的平台如下图所示:
嵌入式Linux发行版本上的Qt属于Qt的EmbeddedLinux分支平台。这个分支平台一般被简称为Qt/E。Qt/E在原始Qt的基础上,做了许多出色的调整以适合嵌入式环境。同Qt/X11相比,Qt/E很节省内存,因为它不需要Xserver或是Xlib库,它在底层摒弃了Xlib,采用framebuffer作为底层图形接口。Qt/E的应用程序可以直接写内核帧缓冲,因此它在嵌入式Linux系统上的应用非常广泛。
Qt/E所面对的硬件平台较多,当开发人员需要在某硬件平台上移植Qt/E时,需要下载Qt源代码,利用交叉编译器编译出Qt库。接着需要将Qt库复制两份,一份放置在开发主机上,供编译使用;一份放在目标板上,供运行时动态加载使用。流程如下图所示:
EasyARM-iMX283提供已交叉编译好的Qt库(Qt-4.8.0),用户无需编译,系统已经将Qt库文件集成到了交叉编译器中。用户将得到此库的两份拷贝,一份内嵌在交叉编译工具链中,供编译时链接使用。一份内嵌在目标板文件系统中,放置在系统库目录下,供Qt程序运行时动态加载使用
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)