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 @ 2020-05-07 00:48  三岁玩童  阅读(3771)  评论(0编辑  收藏  举报