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