C++ QT QScript Connect不工作

C++ QT QScript Connect不工作,c++,qt,qt5,qtscript,C++,Qt,Qt5,Qtscript,qScriptConnect(edit,SIGNAL(textChanged(QString)),QScriptValue(),handler)不起作用,但当我使用handler.call(QScriptValue(),args)时,效果很好 QScriptEngine eng; QScriptEngineDebugger debugger; debugger.attachTo(&eng); QScriptValue consoleObj = eng.newQObject(this);

qScriptConnect(edit,SIGNAL(textChanged(QString)),QScriptValue(),handler)
不起作用,但当我使用
handler.call(QScriptValue(),args)
时,效果很好

QScriptEngine eng;
QScriptEngineDebugger debugger;
debugger.attachTo(&eng);
QScriptValue consoleObj =  eng.newQObject(this);
eng.globalObject().setProperty("asd", consoleObj);
QScriptValue handler= eng.evaluate("(function(text) { asd.log('text was changed to '+text); })");
QLineEdit *edit = new QLineEdit(this);
qScriptConnect(edit, SIGNAL(textChanged(QString)), QScriptValue(), handler);
edit->show();
QScriptValueList参数;
args setupUi(此);
qscripteng;
QScript引擎调试程序;
调试器。附件(&E);
QScriptValue consoleObj=eng.newQObject(本);
eng.globalObject().setProperty(“asd”,控制台对象);
QScriptValue handler=eng.evaluate((函数(文本){asd.log('text已更改为'+text);});
QLineEdit*edit=新的QLineEdit(此);

qDebug()在方法中创建的变量,如果没有在堆中创建,则在执行完该方法后将被删除。在您的情况下,
QScriptEngine
是在构造函数中创建的,这是消除该变量的原因,并且所有脚本都依赖于它。解决方案很简单,将
QScriptEngine
作为类的成员:

main window.h

QScriptValueList args;
args << 3;
handler.call(QScriptValue(),args);
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<qscriptengine.h>
#include<qscriptenginedebugger.h>
#include<qlineedit.h>
#include<qdebug.h>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QScriptEngine eng;
    QScriptEngineDebugger debugger;
    debugger.attachTo(&eng);
    QScriptValue consoleObj =  eng.newQObject(this);
    eng.globalObject().setProperty("asd", consoleObj);
    QScriptValue handler= eng.evaluate("(function(text) { asd.log('text was changed to '+text); })");
    QLineEdit *edit = new QLineEdit(this);
    qDebug()<<qScriptConnect(edit, SIGNAL(textChanged(QString)), QScriptValue(), handler);
    edit->show();
}

MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::log(QString msg)
{
    qDebug() << "jsConsole: "<< msg;
}
\ifndef主窗口
#定义主窗口
#包括
#包括
名称空间用户界面{
类主窗口;
}
类主窗口:公共QMainWindow
{
Q_对象
公众:
显式主窗口(QWidget*parent=0);
~main窗口();
Q_可调用的无效日志(常量QString&text);
私人:
Ui::MainWindow*Ui;
QScriptEngine;//成员
};
#endif//main窗口
main window.cpp

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
      Q_INVOKABLE void log(QString msg);
    ~MainWindow();

private slots:

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QScriptEngine>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

    Q_INVOKABLE void log(const QString & text);

private:
    Ui::MainWindow *ui;
    QScriptEngine eng; // member
};

#endif // MAINWINDOW_H
#包括“mainwindow.h”
#包括“ui_main window.h”
#包括
#包括
#包括
#包括
主窗口::主窗口(QWidget*父窗口):
QMainWindow(父级),
用户界面(新用户界面::主窗口)
{
用户界面->设置用户界面(此);
QScript引擎调试程序;
调试器。附件(&E);
QScriptValue consoleObj=eng.newQObject(本);
eng.globalObject().setProperty(“asd”,控制台对象);
QScriptValue handler=eng.evaluate((函数(文本){asd.log('text已更改为'+text);});
QLineEdit*edit=新的QLineEdit(此);
qScriptConnect(编辑,信号(textChanged(QString)),QScriptValue(),处理程序);
编辑->显示();
}
MainWindow::~MainWindow()
{
删除用户界面;
}
void主窗口::日志(常量QString和文本)
{

qDebug()不工作是什么意思?这个描述非常模糊USQScript Connect返回true,但当line edit的文本发生更改时,什么都不会发生..不起作用,所以您必须创建一个名为log(Qstring)的q_可调用函数..只需添加q_可调用的void log(Qstring)功能调用C++函数从JS…日志函数打印到应用程序输出控制台,使用QDEUG
#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QLineEdit>
#include <QScriptEngine>
#include <QScriptEngineDebugger>

#include <QDebug>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QScriptEngineDebugger debugger;
    debugger.attachTo(&eng);
    QScriptValue consoleObj =  eng.newQObject(this);
    eng.globalObject().setProperty("asd", consoleObj);
    QScriptValue handler= eng.evaluate("(function(text) { asd.log('text was changed to '+text); })");
    QLineEdit *edit = new QLineEdit(this);
    qScriptConnect(edit, SIGNAL(textChanged(QString)), QScriptValue(), handler);
    edit->show();
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::log(const QString &text)
{
    qDebug()<< text;
}