Qt ActiveX控件,QWindow的QWidget容器放入QScrollArea中出现异常
问题描述:
为了支持在网页中播放实时视频,使用Qt做网页插件,用第三方渲染器(D3D)来渲染视频。采用如下方法:
m_window = new QWindow;
m_subWidget = createWindowContainer(m_window, this);
PLAY_Play(m_testPort, (HWND)m_window->winId());
"(HWND)m_window->winId()"可以获取到窗口句柄传给第三方渲染器(D3D)用于渲染视频,而createWindowContainer是作为QWindow的容器可以用于界面布局。当此容器或者与该容器有的父窗口被放入到QScrollArea中,发现页面中所有的控件都变成了Qt::WA_NativeWindow属性,界面布局错乱、下拉框发生偏移,如下:
问题定位
问题定位许久未找到线索(希望有大神能够指点一下,不胜感激),所以决定弃用QScrollArea,此前之所以使用QScrollArea是因为浏览器的滚动条不会自动刷新,比如当切换QStackedWidget页面时,界面的宽高会发生改变,可能超出浏览器活动区域的宽高,而此时浏览器却不会自动出现滚动条,需要人为地调整一下浏览器的宽高,滚动条才会出现。查阅资料得知,当浏览器的窗口发生改变时,会重排整个页面,所以会出现滚动条。所以目前的问题解决方向是:在Qt切换页面时,需要通知浏览器去重排页面,如何使Qt ActiveX插件与浏览器交互是该问题的关键。
查阅资料后得知,Qt的对象中定义如下信号:
signals:
void eventCallBack(int nType, QString strEventName);
在点击按钮,切换页面时,发送该信号:
void ActiveQtSurveillance::buttonClicked()
{
...
emit eventCallBack(1000, "hello world!\n");
}
然后在html中加入函数eventCallBack,如下
<html>
<head>
<title>IPC Demo</title>
<body>
<object id="qtActivex" width="100%" height="100%"
classid="clsid:c3538267-2075-48eb-b623-fb1f7e831132">
</object>
</body>
<script>
var g_temp = 1;
function qtActivex::eventCallBack(nType, strEventName)
{
var ele = document.getElementById('qtActivex');
var winWidth = document.body.clientWidth;
if (g_temp) {
g_temp = 0;
ele.style.width = "99.9%";
} else {
g_temp = 1;
ele.style.width = "99.8%";
}
}
</script>
</html>
当Qt发送信号时,JavaScript就会响应qtActivex::eventCallBack函数,该函数的作用是微调浏览器的客户区大小以实现窗口重排(因为不懂javascript,不知道如何可以直接让浏览器重排,所以用这样的办法来替代)。
经测试,程序运行正常。
上一篇: 移动端H5的悬浮按钮(可拖动)
下一篇: H5移动端开发技巧