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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」