QT中 C++与 js 交互 (上):使用QScriptEngine

1.演示:(1)c++ 调用js ,(2)js中调用c++,(3)在qt中连接js方法,(4)在js中连接c++槽函数,(5)debugger 的使用

代码:main:

复制代码
 1 bool attachDebugger(QScriptEngine &engine, QScriptEngineDebugger &debugger)
 2 {
 3     debugger.attachTo(&engine);
 4     debugger.setAutoShowStandardWindow(true);
 5     //QMainWindow *debugWindow = debugger.standardWindow();
 6     //debugWindow->show();
 7 
 8 //    QObject::connect(debugButton, SIGNAL(clicked()),
 9 //                     debugger.action(QScriptEngineDebugger::InterruptAction),
10 //                     SIGNAL(triggered()));
11 //    QObject::connect(debugButton, SIGNAL(clicked()),
12 //                     debugWindow, SLOT(show()));
13     return true;
14 }
15 
16 QScriptValue evaluateFile(QScriptEngine &engine, const QString &fileName)
17 {
18     QFile scriptFile(fileName);
19     if (!scriptFile.open(QIODevice::ReadOnly)){
20         qDebug()<<"File open fail:"<<scriptFile.errorString();
21         return -1;
22     }
23 
24     QTextStream stream(&scriptFile);
25     QString contents = stream.readAll();
26     scriptFile.close();
27     return engine.evaluate(contents);
28 }
29 
30 bool loadJS(QScriptEngine &engine,QString& path)
31 {
32     QDir jsDir(path);
33     QStringList jsFiles = jsDir.entryList(QStringList("*.js"),QDir::Files);
34     foreach (QString file,jsFiles) {
35         evaluateFile(engine,jsDir.absoluteFilePath(file));
36     }
37 
38     return true;
39 }
40 
41 int main(int argc, char *argv[])
42 {
43     QApplication a(argc, argv);
44 
45     //Use QScriptEngine
46     //创建QScriptEngine引擎
47     QScriptEngine engine;
48     //engine.setProcessEventsInterval(100);
49 
50     //qScriptRegisterMetaType(engine,QMainWindow);
51     //暴露C++给JS
52     centerControl* gpControl = new centerControl();
53     QScriptValue qsControl = engine.newQObject(gpControl,QScriptEngine::QtOwnership);
54     engine.globalObject().setProperty("g_pControl",qsControl);
55 
56     //连接调试器
57     QScriptEngineDebugger debugger;
58     attachDebugger(engine,debugger);
59 
60     //读取配置文件
61     QString JSPath = "../QT_ToolBox/script/";
62     loadJS(engine,JSPath);
63 
64     //call JS function,初始化配置
65     QScriptValue qsObject = engine.globalObject().property("objGlobal");
66     QScriptValueList args;
67     args<<"11"<<"22";
68     qsObject.property("loadTool").call(qsObject, args);
69 
70     //connect to js in C++
71     /*//eg:1
72     QScriptValue qsTestSlot = qsObject.property("qsTestSlot");
73     bool b = qScriptConnect(gpControl->getMainWindow(),SIGNAL(testSignal(int)),qsObject,qsTestSlot);
74     */
75     /*//eg:2
76     QPushButton* bt = new QPushButton();
77     QScriptValue qsTestSlot = qsObject.property("qsTestSlot");
78     bool b = qScriptConnect(bt,SIGNAL(clicked()),qsObject,qsTestSlot);
79     bt->show();
80     */
81     //qDebug()<<b;
82 
83     return a.exec();
84 }
复制代码

JS

复制代码
 1 var objGlobal = new Object;
 2 objGlobal.initialized = false;
 3 
 4 objGlobal.loadTool = function() {
 5     //debugger
 6     var argsArray = this.loadTool.arguments;
 7 
 8     //connect to c++ in JS
 9     g_pControl.testSignal.connect(objGlobal,'qsTestSlot');
10 
11     if (!this.initialized) {
12         g_pControl.createMainWindow();
13         this.initialized = true;
14     }
15 
16 };
17 
18 objGlobal.qsTestSlot = function() {
19     debugger
20     var argsArray = this.loadTool.arguments;
21 };
复制代码

c++

复制代码
 1 class centerControl: public QObject
 2 {
 3     Q_OBJECT
 4 
 5 public:
 6     centerControl();    
 7 
 8     Q_INVOKABLE void createMainWindow();
 9     Q_INVOKABLE QMainWindow* getMainWindow(){ return m_pMainWindow; }
10 
11 signals:
12     void testSignal();
13 
14 private:
15     QMainWindow* m_pMainWindow = nullptr;
16 };
复制代码

3.完整工程代码:

https://github.com/SanSuiWanTong/QT_ToolBox

commit first 

posted @   三岁玩童  阅读(3877)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
点击右上角即可分享
微信分享提示