C++ Qt:无法从javascript调用共享对象方法/属性

C++ Qt:无法从javascript调用共享对象方法/属性,c++,qt,qtwebengine,C++,Qt,Qtwebengine,对于这个问题,我尝试了与Vicky Chijwani完全相同的答案 一切都很好,但我无法调用jshelper的任何方法或属性 请看一下我的代码 myclass.h class MyClass : public QObject { Q_OBJECT public: MyClass(QObject *parent = 0); void print(); int num; signals: public slots: }; class MyWebEngineVi

对于这个问题,我尝试了与Vicky Chijwani完全相同的答案 一切都很好,但我无法调用jshelper的任何方法或属性

请看一下我的代码 myclass.h

class MyClass : public QObject
{
    Q_OBJECT
public:
    MyClass(QObject *parent = 0);
    void print();

    int num;

signals:

public slots:
};
class MyWebEngineView : public QWebEngineView
{
public:
    MyWebEngineView(QWidget *parent);

    MyClass helper;
};
myclass.cpp

MyClass::MyClass(QObject *parent) : QObject(parent)
{
 num=100;
}

void MyClass::print()
{
    QMessageBox bx;
    bx.exec();
}
MyWebEngineView::MyWebEngineView(QWidget *parent): QWebEngineView(parent)
{
    QWebChannel *channel = new QWebChannel(page());
    channel->registerObject(QStringLiteral("jshelper"), &helper);load(QUrl::fromLocalFile(QFileInfo("../html/index.html").absoluteFilePath()));
    page()->setWebChannel(channel);
}
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    view = new MyWebEngineView(this);
    view->setGeometry(10, 10, 500, 500);
    view->load(QUrl::fromLocalFile(QFileInfo("../html/index.html").absoluteFilePath()));
}
mywebengineview.h

class MyClass : public QObject
{
    Q_OBJECT
public:
    MyClass(QObject *parent = 0);
    void print();

    int num;

signals:

public slots:
};
class MyWebEngineView : public QWebEngineView
{
public:
    MyWebEngineView(QWidget *parent);

    MyClass helper;
};
mywebengineview.cpp

MyClass::MyClass(QObject *parent) : QObject(parent)
{
 num=100;
}

void MyClass::print()
{
    QMessageBox bx;
    bx.exec();
}
MyWebEngineView::MyWebEngineView(QWidget *parent): QWebEngineView(parent)
{
    QWebChannel *channel = new QWebChannel(page());
    channel->registerObject(QStringLiteral("jshelper"), &helper);load(QUrl::fromLocalFile(QFileInfo("../html/index.html").absoluteFilePath()));
    page()->setWebChannel(channel);
}
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    view = new MyWebEngineView(this);
    view->setGeometry(10, 10, 500, 500);
    view->load(QUrl::fromLocalFile(QFileInfo("../html/index.html").absoluteFilePath()));
}
main window.cpp

MyClass::MyClass(QObject *parent) : QObject(parent)
{
 num=100;
}

void MyClass::print()
{
    QMessageBox bx;
    bx.exec();
}
MyWebEngineView::MyWebEngineView(QWidget *parent): QWebEngineView(parent)
{
    QWebChannel *channel = new QWebChannel(page());
    channel->registerObject(QStringLiteral("jshelper"), &helper);load(QUrl::fromLocalFile(QFileInfo("../html/index.html").absoluteFilePath()));
    page()->setWebChannel(channel);
}
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    view = new MyWebEngineView(this);
    view->setGeometry(10, 10, 500, 500);
    view->load(QUrl::fromLocalFile(QFileInfo("../html/index.html").absoluteFilePath()));
}
最后是javascript

<script type="text/javascript">
        var jshelper;
        document.addEventListener("DOMContentLoaded", function () {
            new QWebChannel(qt.webChannelTransport, function(channel) {
                alert('ok');
                // all published objects are available in channel.objects under
                // the identifier set in their attached WebChannel.id property

                jshelper = channel.objects.jshelper;
                alert( jshelper.num );
                jshelper.print();

            });
        });

        </script>

我的代码有什么问题,我试图在4天左右修复这个问题,但我无法修复它

我知道在QWebKit下,我必须使成员函数如下所示:

public slots:
    Q_INVOKABLE void print();

我知道在QWebKit下,我必须使成员函数如下所示:

public slots:
    Q_INVOKABLE void print();

我知道我很晚才提供注释,但是如果有问题的函数是在slots部分声明的,那么您不必使用Q_INVOKABLE。如果有多个函数,则键入的内容会稍微减少

class MyClass : public QObject
{
    Q_OBJECT
public:
    MyClass(QObject *parent = 0);

slots:
    void print();
}

我知道我很晚才提供注释,但是如果有问题的函数是在slots部分声明的,那么您不必使用Q_INVOKABLE。如果有多个函数,则键入的内容会稍微减少

class MyClass : public QObject
{
    Q_OBJECT
public:
    MyClass(QObject *parent = 0);

slots:
    void print();
}

console.log(channel.objects.jshelper)
,或
console.log(channel.objects)
说什么?jshelper:_uid:_u:“jshelper”objectSignals:objectpropertycache\u uu:ObjectdeleteLater:function(){销毁:Objectconnect:function(callback){断开:function(callback){proto:ObjectobjectName:(…)get objectName:function(){set objectName:function(value){objectNameChanged:ObjectpropertyUpdate:function(signals,propertyMap)SignalEmissed:function(signalName,signalArgs)unwrapProperties:function()unwrapQObject:function(response)__proto\uuuu:QObjectSo no
num
print
功能清晰。是的,我缺少了什么..?我无法弄清楚。console.log(channel.objects.jshelper)或
console.log(channel.objects)
说什么?jshelper:\uuuu id\uuuu:“jshelper”objectSignals:Object\uu属性缓存:ObjectdeleteLater:function(){销毁:Objectconnect:function(callback){断开连接:function(callback){proto:ObjectobjectName:(…)get objectName:function(){设置objectName:function(value){objectName更改:ObjectpropertyUpdate:function(signals,propertyMap)signalEmissed:function(signalName,signalArgs)unwrapProperties:function()unwrapQObject:function(回答)uuu proto_uuuuu:QObjectSo no
num
print
功能清晰。是的,我遗漏了什么?我想不出来。谢谢你。qtwebengine也需要Q_可调用。我从未尝试过这个。:(现在它工作了。谢谢你。qtwebengine也需要Q_可调用。我从未尝试过这个。)。