首页 > 解决方案 > Qt WebChannel API 在客户端不起作用

问题描述

我正在尝试使用 Qt WebEngine 和 WebChannel API 从 C++ 小部件向 JavaScript 发出信号。预期的行为是,当我单击 tableView 小部件中一行的名称列时,应该会出现一个新的小部件窗口,其中包含该行的一些额外数据。目前,如果我添加一个按钮并将其连接到发出信号的插槽,它就可以工作(JavaScipt 文件中的 connect 方法有效)。但是,我希望这样当我单击该列时,它会自动将数据发送到 JS,而无需单击按钮。目前我只是发送一个 QString,但稍后我还需要发送其他复杂的数据。如果我在 myWidget.cpp 文件中执行以下操作,则不会在 JS 中调用 connect 方法。

// The slot
void myWidget::getData(QString data)
  {
    emit sendDataToJS(data);
    qDebug() << "getData clicked" << data;
  }

内部.h:

public slots:
    void getData(QString txt);
signals:
    void sendDataToJS(const QString& seq);

main.cpp 内部

// Initializing the window:
myWidget* widget = new myWidget();
widget->getData(data); 
widget->show();

但是如果我添加一个按钮并在构造函数中添加连接方法,那么它就可以工作(但在这种情况下我必须单击按钮,我不想要那个)

//Works
  myWidget::myWidget(QWidget* parent) :
      QWidget(parent), ui(new Ui::myWidget)
  {
    ui->setupUi(this);
    QPushButton* btn = new QPushButton("Click here to visualize...");
    QWebEngineView* view = new QWebEngineView(parent);
    QWebChannel* channel = new QWebChannel(this);
    view->page()->setWebChannel(channel);
    channel->registerObject(QString("jsObj"), this);
    connect(btn, SIGNAL(clicked()), this, SLOT(slotSendDataToJS()));
    view->load(QUrl("qrc:/new/data_viz.html"));
    ui->gridLayout->addWidget(btn);
    ui->gridLayout->addWidget(view);
  }

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

  void myWidget::slotSendDataToJS()
  {
    QString data= "TESTING_123!";
    qDebug() << "emitting signal..." << data;
    emit sendDataToJS(data);
  }

JavaScript 代码:

        document.addEventListener("DOMContentLoaded", function () {
        console.log("DOM Loaded...");
        new QWebChannel(qt.webChannelTransport,
        function(channel){

        var JSObj = channel.objects.jsObj;

        JSObj.sendDataToJS.connect(function(data) {
                console.log("Inside connect!");
                document.getElementById("data").innerHTML = data;
            });
        });
        });

标签: c++qtqtwebengineqtwebchannel

解决方案


推荐阅读