Qt:无法从 javascript 调用共享对象方法/属性
Posted
技术标签:
【中文标题】Qt:无法从 javascript 调用共享对象方法/属性【英文标题】:Qt: Cannot invoke shared object methods/properties from 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);
mainwindow.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
所以没有 num
或 print
功能明确。
是的,我错过了什么..?我无法弄清楚。
【参考方案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();
【讨论】:
以上是关于Qt:无法从 javascript 调用共享对象方法/属性的主要内容,如果未能解决你的问题,请参考以下文章
使用 Qt runJavaScript 函数访问 Javascript 类对象