C和x2B之间的通信+;和WebGL的Javascript 我和我的朋友正在尝试C++与JavaScript之间的通信。 我们希望使用嵌入在C++/Qt(5.6版)应用程序中的WebGL在给定位置渲染一些球体

C和x2B之间的通信+;和WebGL的Javascript 我和我的朋友正在尝试C++与JavaScript之间的通信。 我们希望使用嵌入在C++/Qt(5.6版)应用程序中的WebGL在给定位置渲染一些球体,javascript,c++,qt,webgl,qwebview,Javascript,C++,Qt,Webgl,Qwebview,为此,我们使用一个QWebView,它读取一个包含所有WebGL的JS代码的HTML文件。这很好,我们的应用程序中有一个很棒的高级3D渲染器./P>共享。 更确切地说,C++知道我们需要显示的球的数量和位置,并且必须把它告诉JavaScript端。最好的方法是什么 注意:我们尝试使用Qt Canvas3D,但与经典的WebGL相比速度太慢 编辑1-第一次尝试后 我试着做你写的,也读了一些例子(像这样),但我不能让它工作 我创建了QWebEngineView的一个子类,我在其中执行所有初始化并放置

为此,我们使用一个
QWebView
,它读取一个包含所有WebGL的JS代码的HTML文件。这很好,我们的应用程序中有一个很棒的高级3D渲染器<问题是,C++所知道的位置必须与JavaScript < /St>./P>共享。 更确切地说,C++知道我们需要显示的球的数量和位置,并且必须把它告诉JavaScript端。最好的方法是什么

注意:我们尝试使用Qt Canvas3D,但与经典的WebGL相比速度太慢

编辑1-第一次尝试后

我试着做你写的,也读了一些例子(像这样),但我不能让它工作

我创建了QWebEngineView的一个子类,我在其中执行所有初始化并放置数据

.h:

当我运行它时:

  • getNumber只调用一次,似乎是在调用QWebChannel之后调用的
  • 我有警告:对象“WebGLView”的属性“num”没有通知信号,并且不是常量,HTML中的值更新将被破坏
  • nspherefromc是将显示的球体数。显示50,而不是10
有什么想法吗

编辑2秒尝试

我还是不能让它工作。 我尝试添加一个名为more的新变量,以查看是否调用了函数或是否输入了if语句:

var more = 0;
        if (typeof qt != 'undefined') {
            new QWebChannel(qt.webChannelTransport, function(channel) {
                JSobject = channel.objects.test;
                more = 1000;
            }
            );
        }
我仍然有:

    if (typeof JSobject !== 'undefined') {
        nspherefromc =  JSobject.num;
    }
    else {nspherefromc = 50;}
    ...
    var spheresNum = nspherefromc + more;//Number of Spheres
运行时,我只有50个球体。未调用QWebChannel中的函数。我想我应该自己叫它?什么时候? 我还在if(typeof qt!=“undefined”)语句中尝试了更多的调试,得到了1050个球体

编辑3-使用HTML调试器

    function init() {
        var JSobject;
        var nspherefromc = 0;
        if (typeof qt !== 'undefined') {
            new QWebChannel(qt.webChannelTransport, function(channel) {
                JSobject = channel.objects.test;
                console.log(JSobject); //-> returns the object, I can access the functions and everything
                nspherefromc =  JSobject.num;
                console.log("in the function " + nspherefromc); //prints 5000, what i sent from C++
                more = 1000;
            }
            );
            console.log(JSobject); // prints undefined
        }
        console.log(JSobject); // prints undefined
        if (typeof JSobject !== 'undefined') {
            console.log("Yeaaaah"); //Not reached
            nspherefromc =  JSobject.num;
            nspherefromc + 1;
        }
        ...
        console.log("when loading " + nspherefromc + " (more is = to " + more); // nsphere = 0 , more = 0
            var spheresNum = nspherefromc + more;
这意味着在函数之外,我无法再访问JSobject了。你知道为什么吗

编辑-最后
当接收到来自C++的数据时,OpenGL已经初始化。因此,显示的球数不是C++所要求的。在QT5.6中,

< P>,如果你想使C++部分和JavaScript通信,唯一的方法就是使用A。您可以在
.cpp
文件中这样做:

m_pView = new QWebEngineView(this);
QWebChannel * channel = new QWebChannel(page);
m_pView->page()->setWebChannel(channel);
channel->registerObject(QString("TheNameOfTheObjectUsed"), this);
在这里,您只需说您注册了一个名为
theNameOfObject
的对象,该对象将在JS端可用。现在,这是要在JS端使用的代码部分:

new QWebChannel(qt.webChannelTransport, function (channel) {
            // now you retrieve your object
            var JSobject = channel.objects.TheNameOfTheObjectUsed;
        });
var nbSpheres = JSobject.NumberOfSpheres;

和在你的情况下,你想检索球的数量,一些位置等。所以你需要在C++侧有一个方法,返回一个字符串,一个整数,一个长…这是C++上的,在你的代码> h < /> >:

Q_INVOKABLE int getNumberOfSpheres();
Q_PROPERTY(int NumberOfSpheres READ getNumberOfSpheres);
现在,在JS端得到了如下球体的数量:

new QWebChannel(qt.webChannelTransport, function (channel) {
            // now you retrieve your object
            var JSobject = channel.objects.TheNameOfTheObjectUsed;
        });
var nbSpheres = JSobject.NumberOfSpheres;
这是一个非常简单的解释,我建议你看一看,这对我非常有用。此外,您可能想阅读更多关于QWebChannel提供的,以及关于的文档

希望有帮助


编辑后1

在.h中,您需要添加(或更改):

在.cpp中的构造函数中:

connect(this, SIGNAL(numChanged()), this, SLOT(numHasChanged()));
在cpp本身中:

void WebGLView::setNumber(int number)
{
    m_pNumber = number;
    emit numChanged();
}

int WebGLView::getNumber()
{
    return m_pNumber;
}


void WebGLView::numHasChanged()
{
     // do anything here
}
在JS方面非常重要:

首先,要小心,您复制了一些代码而没有检查,所以我认为您的意思是:

if (typeof JSobject !== 'undefined')
而不是

if (typeof widget !== 'undefined')
然后:

var nspherefromc =  JSobject.num; // this is ok
var nspherefromc =  JSobject.getNumber; // this is NOT ok

现在,无论何时更改JS中的变量
num
,都会发出一个信号(
numChanged
),您将能够使用
getNumber()
获取相应插槽中的值

什么版本的Qt?Qt 5.6。谢谢你的问题,我在描述中添加了它。我在编辑之后编辑了我的答案。从编辑编号3:尝试在函数之外定义
var JSobject
init()
在将其放入init()之前也尝试过。同样的结果…这很有帮助!非常感谢。我开始看视频,现在我要试试看。再次感谢:)很高兴为您提供帮助:)如果您在尝试时有任何其他问题,请不要犹豫!我在阻止。。。我和你一样,我甚至读过其他有用的例子,但我仍然有困难。如何向您显示更多代码?评论还是编辑?嗯,只是用你迄今为止尝试过的内容编辑你的帖子(因为你需要20个代表才能在聊天中发言)谢谢你的回答:)我现在正在尝试。快速问题:如果我们已经有一个Q_属性num,为什么我们需要m_pNumber?
if (typeof JSobject !== 'undefined')
if (typeof widget !== 'undefined')
var nspherefromc =  JSobject.num; // this is ok
var nspherefromc =  JSobject.getNumber; // this is NOT ok