QT中qScriptConnect绑定信号失效,handler.call正常问题求助
嘿,我找到问题的根源啦!
你遇到的情况是:用qScriptConnect绑定QLineEdit的textChanged(QString)到JS函数没反应,但直接调用handler.call()却能正常执行。这核心原因是你的QScriptEngine是构造函数里的局部变量——当MainWindow的构造函数执行完毕后,这个引擎对象就会被销毁,之前建立的信号绑定失去了依赖的JS运行环境,所以信号触发时根本找不到对应的执行上下文。而你直接调用handler.call()是在构造函数内部,此时引擎还存在,所以能正常工作。
修复方案
把QScriptEngine和调试器改成MainWindow的成员变量,让它们的生命周期和MainWindow保持一致,这样信号触发时JS环境依然有效。
修改后的mainwindow.h
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QScriptEngine> #include <QScriptEngineDebugger> namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); Q_INVOKABLE void log(QString msg); ~MainWindow(); private: Ui::MainWindow *ui; // 将引擎和调试器改为类成员变量,延长生命周期 QScriptEngine m_eng; QScriptEngineDebugger m_debugger; }; #endif // MAINWINDOW_H
修改后的mainwindow.cpp
#include "mainwindow.h" #include "ui_mainwindow.h" #include<QLineEdit> #include<QDebug> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); m_debugger.attachTo(&m_eng); QScriptValue consoleObj = m_eng.newQObject(this); m_eng.globalObject().setProperty("asd", consoleObj); QScriptValue handler= m_eng.evaluate("(function(text) { asd.log('text was changed to '+text); })"); QLineEdit *edit = new QLineEdit(this); // 可以打印返回值确认绑定是否成功 bool isConnected = qScriptConnect(edit, SIGNAL(textChanged(QString)), QScriptValue(), handler); qDebug() << "绑定结果:" << isConnected; edit->show(); } MainWindow::~MainWindow() { delete ui; } void MainWindow::log(QString msg) { qDebug() << "jsConsole: "<< msg; }
额外提示
修改后,引擎的生命周期和MainWindow一致,当你在QLineEdit中输入内容时,textChanged信号触发后,JS函数就能正常执行并调用你的log方法啦。你可以通过qScriptConnect的返回值判断绑定是否成功,返回true就说明绑定有效。
内容的提问来源于stack exchange,提问作者Nishad
相关产品推荐
相关产品推荐

