1. 现象
首先定义一个类,暴露接口给js代码:
#include <QObject>
class TestObject : public QObject {
public:
explicit TestObject(QObject *parent = nullptr) : QObject(parent) {}
signals:
void testSig(QString);
public slots:
void testSlot() { emit testSig("test"); }
};
注册类的代码省略,参考qt例程即可。
页面代码如下:
var channel;
window.onload = function() {
channel = new QWebChannel(qt.webChannelTransport, function(channel) {});
}
function btnClicked() {
obj = channel.objects.TestObject;
obj.testSig.connect(function (str) {
alert(str)
});
obj.testSlot();
}
...
<input type="submit" id="test-btn" value="测试" onclick="btnClicked()" />
出现的现象:
- 第一次点击“测试”按钮,alert触发一次
- 第二次点击“测试”按钮,alert触发两次
- 第N次点击,触发N次
2. 分析
由现象推测,问题出现的原因,应该是connect被调用多次。每点击一次按钮,就增加了一个回调,所以回调触发的次数跟按钮点击的次数相同。
3. 解决
由以上分析,只要不多次调用connect即可,代码如下:
var obj;
window.onload = function() {
new QWebChannel(qt.webChannelTransport, function(channel) {
obj = channel.objects.TestObject;
obj.testSig.connect(function (str) {
alert(str)
});
});
}
function btnClicked() {
obj.testSlot();
}
...
<input type="submit" id="test-btn" value="测试" onclick="btnClicked()" />
测试结果:多次点击也只回调一次,问题解决。