【问题标题】:Qt: Cannot invoke shared object methods/properties from javascriptQt:无法从 javascript 调用共享对象方法/属性
【发布时间】:2015-09-25 14:25:44
【问题描述】:

我已经尝试过与 Vicky Chijwani 对这个问题的回答完全相同 QT QWebEnginePage::setWebChannel() transport object 一切都很好,但我无法调用 jshelper 的任何方法或属性。

请看我的代码 myclass.h

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

    int num;

signals:

public slots:
};

myclass.cpp

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

void MyClass::print()
{
    QMessageBox bx;
    bx.exec();
}

mywebengineview.h

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

    MyClass helper;
};

mywebengineview.cpp

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);
}

ma​​inwindow.cpp

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>

问题是这两行永远不会正确执行

alert( jshelper.num ); // gives 'undefined' message
jshelper.print(); //will not work

我的代码出了什么问题,我试图在 4 天左右解决这个问题,但我无法解决它。

【问题讨论】:

  • console.log(channel.objects.jshelper)console.log(channel.objects) 说什么?
  • jshelper:__id__: "jshelper"objectSignals: Object__propertyCache__: ObjectdeleteLater: function () {destroyed: Objectconnect: function (callback) {disconnect: function (callback) {proto: ObjectobjectName: (...)get objectName: function () {set objectName: function (value) {objectNameChanged: ObjectpropertyUpdate: function (signals, propertyMap)signalEmitted: function (signalName, signalArgs)unwrapProperties: function ()unwrapQObject:函数(响应)__proto__:QObject
  • 所以没有 numprint 功能明确。
  • 是的,我错过了什么..?我无法弄清楚。

标签: c++ qt qtwebengine


【解决方案1】:

我知道在 QWebKit 下,我必须让成员函数看起来像这样:

public slots:
    Q_INVOKABLE void print();

【讨论】:

  • 非常感谢。 qtwebengine 也需要 Q_INVOKABLE。我从来没有试过这个。 :( 现在它的工作。
【解决方案2】:

我知道我迟到了,但如果有问题的函数在插槽部分中声明,则不必使用 Q_INVOKABLE。如果有多个函数,则键入会稍微少一些。

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

slots:
    void print();
}

【讨论】:

    猜你喜欢
    • 2017-05-08
    • 1970-01-01
    • 2018-01-19
    • 1970-01-01
    • 2012-06-24
    • 1970-01-01
    • 2021-11-06
    • 1970-01-01
    • 2017-02-25
    相关资源
    最近更新 更多