我正在尝试使用 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;
});
});
});