在Qt和html网页连接过程中,我的控制台一直打印Property ‘modal’’ of object ‘frmHaiNanMap’ has no notify signal and is not constant, value updates in HTML will be broken! Property ‘windowModality’’ of object ‘frmHaiNanMap’ has no notify signal and is not constant, value updates in HTML will be broken!等一串代码
我去上网查,发现没有多少资料,而且查到的都是关于和qml通信的问题,可我的项目是和html网页通信的,后面发现是Qt 的WebEngine类引起的,也就是有这串代码的原因
webChannel = new QWebChannel;
webChannel->registerObject(QString("map"), this);
就是这个this,this 对象含有 Q_PROPERTY 声明,它会把所有的属性都暴露给js,但是这些modal和windowModality等属性缺少notify信号,或者它们不是常量,影响了和界面同步更新的问题,控制台就会打印这些信息,而为了避免这个问题,一般都是要给每个属性添加notify信号,但是我打印出来的属性有很多,一个一个添加太过繁琐,并且我的项目只是引入界面,并不想改变Qt界面里的相关属性(例如 宽度、高度那些),所以我在想有没有简单一点的方法。
划重点!! ! 那就是创建一个接口类MapInterface让它继承QObject,然后你自己自定义方法,需要哪些属性暴露给js都可以自己写,在这里和js进行通信,就可以解决这个问题,下面是我的具体步骤,可以参考一下
这个是MapInterface.h,我只想要这个receiveDataFromJs函数和js通信,所以我就只写了这个
#ifndef MAPINTERFACE_H
#define MAPINTERFACE_H
#include <QObject>
class MapInterface : public QObject
{
Q_OBJECT
public:
explicit MapInterface(QObject *parent = nullptr);
~MapInterface();
public slots:
void receiveDataFromJs(const QString &type, const QVariant &data);
signals:
void btnJump(int);
private:
};
#endif // MAPINTERFACE_H
我把主要用来和js进行通信的函数放在这里就好了,然后注意它是继承QObject
然后MapInterface.cpp就是写你通信的主要内容,这个根据自己需要提供
然后就是在你创建QWebEngineView和QWebChannel的类里面去改代码,我的是这里
创建MapInterface对象,然后把this换成mapInterface,记得要添加头文件
#include "mapinterface.h"
这是代码
webChannel = new QWebChannel;
MapInterface *mapInterface = new MapInterface;
webChannel->registerObject(QString("map"),mapInterface);
最后一键运行,控制台就不再有警告信息了!完美解决!