标题:QT界面嵌入第三方应用窗口
作者:robot203
日期:2019-03-06 15:35
内容:
需求:用QT开发主界面,要求嵌入第三方视频监视软件的界面到我的主界面中,同时要求视频监视软件的画面保留鼠标操作功能。如下图1所示:
图1
技术思路:首先使用QProcess类打开该视频监视软件,然后使用FinWindow()获取监视软件的窗口句柄,设置该窗口句柄的QWindow代理,接着使用createWindowContainer()将该QWindow对象放入容器QWidget中,最后设置QWidget的父窗口。源代码如下:
问题汇总:
问题描述1:使用上述方法,可以将视频软件的窗口嵌入到主界面中,但只能进行部分鼠标操作。要想获得全部鼠标操作,点击下图2中蓝色圈内的部件使“我的设备/本地设备”这一栏收缩,然后再点击同样位置展开。这时该视频监视窗口的界面的所有鼠标操作都能使用,但是只要在红圈内按下鼠标左键并移动鼠标,则这个嵌入的窗口就发生偏移甚至消失,如图3所示。请问有什么方法可以固定嵌入窗口的位置同时保证进行所有鼠标操作?图2
图3
问题描述2:该嵌入的窗口无法调整大小,只能使用其默认的size。就算调整该了容器QWidget对象的size,但是只要一点击画面,该窗口就恢复成默认的size。请问:除了用QScrollArea类之外,还有什么方法可以调整该嵌入窗口的size?
开发环境:WIN7 32位/QT5.11.1/MinGW 32bit
备注:之所以要进行窗口大小的调整,是因为默认size比工控机屏幕要大不少,难以全部展示。我曾使用QScrollArea对其进行封装,但是这样就导致了很多鼠标操作 ..
#1 [robot203 03-06 15:44]
谢谢各位大佬关注!拜托各位指点指点!
#2 [liudianwu 03-06 17:07]
可以试试直接用SDK自己写一个类似的呢?
#3 回 liudianwu 的帖子 [robot203 03-06 21:29]
liudianwu:可以试试直接用SDK自己写一个类似的呢?(2019-03-06 17:07)
主要是萤石他们提供的SDK是基于萤石云网络的,没有提供基于局域网的SDK,而我的应用场合不一定有网络。
#4 回 liudianwu 的帖子 [robot203 03-06 21:34]
liudianwu:可以试试直接用SDK自己写一个类似的呢?(2019-03-06 17:07)
是不是用createWindowContainer()本身就存在这种弊端吗?是否无法克服?谢谢大佬!
#5 [stlcours 03-07 00:14]
第二个问题恐怕没办法,除非你写一个DLL打入对方窗口的内部(子类化对方窗口),覆盖WM_SIZE消息(也许还有别的消息),对这个消息全部屏蔽。否则,如果原来别人的软件不断想要显示成某个尺寸,你又怎么拦得住呢?
第一个问题,可能是第二个问题的翻版,一旦对方窗口失去焦点,它可能想要恢复某个尺寸,或者它认为失去焦点以后不能做所有操作。解决办法是,你在红框里操作完以后,立刻向这个嵌入窗口发一个消息,给它焦点、给它SetWindowsPos提升至最前面,并且用代码把鼠标移到嵌入的窗口内。至于操作红框时候的偏差那就算啦~
怎么样写DLL子类化别人的窗口?网上的文章还是挺多的,王艳平的《Windows程序设计》书里也有,可以仔细看一下。