• 11966阅读
  • 7回复

[提问]QT界面嵌入第三方应用窗口 [复制链接]

上一主题 下一主题
离线robot203
 

只看楼主 倒序阅读 楼主  发表于: 2019-03-06

需求:用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对其进行封装,但是这样就导致了很多鼠标操作的损失,而损失的这部分恰恰很重要。
离线robot203

只看该作者 1楼 发表于: 2019-03-06
谢谢各位大佬关注!拜托各位指点指点!
离线liudianwu

只看该作者 2楼 发表于: 2019-03-06
可以试试直接用SDK自己写一个类似的呢?
欢迎关注微信公众号:Qt实战/Qt入门和进阶(各种开源作品、经验整理、项目实战技巧,专注Qt/C++软件开发,视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发) QQ:517216493  WX:feiyangqingyun  QQ群:751439350
离线robot203

只看该作者 3楼 发表于: 2019-03-06
回 liudianwu 的帖子
liudianwu:可以试试直接用SDK自己写一个类似的呢? (2019-03-06 17:07) 

主要是萤石他们提供的SDK是基于萤石云网络的,没有提供基于局域网的SDK,而我的应用场合不一定有网络。
离线robot203

只看该作者 4楼 发表于: 2019-03-06
回 liudianwu 的帖子
liudianwu:可以试试直接用SDK自己写一个类似的呢? (2019-03-06 17:07) 

是不是用createWindowContainer()本身就存在这种弊端吗?是否无法克服?谢谢大佬!
离线stlcours

只看该作者 5楼 发表于: 2019-03-07
第二个问题恐怕没办法,除非你写一个DLL打入对方窗口的内部(子类化对方窗口),覆盖WM_SIZE消息(也许还有别的消息),对这个消息全部屏蔽。否则,如果原来别人的软件不断想要显示成某个尺寸,你又怎么拦得住呢?

第一个问题,可能是第二个问题的翻版,一旦对方窗口失去焦点,它可能想要恢复某个尺寸,或者它认为失去焦点以后不能做所有操作。解决办法是,你在红框里操作完以后,立刻向这个嵌入窗口发一个消息,给它焦点、给它SetWindowsPos提升至最前面,并且用代码把鼠标移到嵌入的窗口内。至于操作红框时候的偏差那就算啦~

怎么样写DLL子类化别人的窗口?网上的文章还是挺多的,王艳平的《Windows程序设计》书里也有,可以仔细看一下。
离线stlcours

只看该作者 6楼 发表于: 2019-03-07
这个问题必须对症下药,要看看对方软件整天在做什么、接收什么消息。比如用Spy++软件观察它失去焦点时候的行为、鼠标移出去以后的行为、不是Windows当前顶级窗口时的行为。
离线robot203

只看该作者 7楼 发表于: 2019-03-07
回 stlcours 的帖子
stlcours:第二个问题恐怕没办法,除非你写一个DLL打入对方窗口的内部(子类化对方窗口),覆盖WM_SIZE消息(也许还有别的消息),对这个消息全部屏蔽。否则,如果原来别人的软件不断想要显示成某个尺寸,你又怎么拦得住呢?
第一个问题,可能是第二个问题的翻版,一旦对方窗口失去焦点, .. (2019-03-07 00:14) 

谢谢大佬提供的思路和参考资料!我先按照这个思路去试试看行不行。
快速回复
限100 字节
 
上一个 下一个