qt与qwebengineview交互完整参考示例代码-kb88凯时官网登录

来自:网络
时间:2024-09-10
阅读:
免费资源网,https://freexyz.cn/

前言

最近刚好需要做一个qt与webview的交互,顺便写下整个的交互流程,给需要的各位参考学习。后面会补充,qt上应用其他web上的开源图标类的组件js库,例如echart,vis.js等,通过 qt javascript qwebchannel qwebengineview 的组合,很多酷炫的效果都可以很方便的做出来。

1:qt的web 引擎与 webview交互历史变更

qt 5.6 引入了 qt webengine 模块:

在过去,qt 使用的是 qt webkit 作为其 web 引擎。但自 qt 5.6 版本开始,qt 引入了基于 chromium 的新的 web 引擎,称为 qt webengine。这个改变带来了更好的性能、更好的 html5 和 css3 支持以及更好的安全性。

qwebview 被 qwebengineview 替代:

在使用 qt webkit 时,开发者使用 qwebview 类来显示 web 内容。但是随着 qt webengine 的引入,qt 引入了 qwebengineview 类来取代 qwebview。qwebengineview 基于新的 web 引擎,并提供了更现代化的 api 和功能。

引入了新的通信机制 - qwebchannel:

在 qt webengine 中,引入了 qwebchannel 作为一种新的机制,用于在 c 代码和 javascript 代码之间进行通信。通过 qwebchannel,可以将 c 对象暴露给 javascript,使得它们可以相互调用和交互。
更好的扩展性和性能:

由于 qt webengine 基于 chromium,因此具有更好的性能和扩展性。它可以使用 chromium 提供的各种功能和特性,包括先进的渲染引擎、多线程支持、gpu 加速等。

更新的 html5 和 css3 支持:

qt webengine 提供了更现代化的 html5 和 css3 支持,使得开发者可以更轻松地创建丰富、交互性强的 web 应用程序。
这些是 qt 的 web 引擎与 webview 交互方面的一些主要变化。总的来说,随着 qt webengine 的引入,qt 在 web 开发领域取得了重大进步,为开发者提供了更好的工具和功能来创建高性能的 web 应用程序。

2:示例展示

示例是完整qt代码和html文件,可以直接测试,注释也写了一些

通过qwebchannel进行注册和调用:

这种方法是在qt中注册qobject对象,使其可以在javascript中调用。使用qwebchannel类来建立qt与javascript之间的通信桥梁。

在qt代码中,通过registerobject方法将qobject对象注册到qwebchannel中,然后在javascript中使用该对象。可以定义槽函数和属性,这些槽函数和属性可以在javascript中直接调用和访问。在javascript中调用这些槽函数来执行特定的操作,或者读取和设置属性。

这种方法适用于在web页面中需要与qt代码进行交互的场景,需要从web页面中触发特定操作,并且在qt代码中执行相应的处理时,或者需要在web页面中显示qt代码中的数据时这样做很方便。

如果想要简单的qt调用javascript函数的话,就使用runjavascript方法就行

总的来说,如果需要频繁地进行 c 和 javascript 之间的通信,使用连接信号与槽会更加方便和高效。而如果只是偶尔需要执行一些 javascript 代码,使用 `runjavascript` 也是一个不错的选择。

#pragma once
#include 
#include 
class qwebengineview;
class qwebchannel;
class frmgplot : public qwidget
{
	q_object
	/*q_property 定义了一个名为 jsondata 的属性,
	其类型为 qjsonobject,并将其与一个名为 qtjsondata 的成员变量关联起来。
	当qtjsondata改变时,会自动触发qtdatachanged信号
	要在类中声明好 信号(qtdatachanged) 和 成员(qtjsondata)
	*/
	q_property(qjsonobject jsondata member qtjsondata notify qtdatachanged)
public:
	frmgplot(qwidget *parent);
	~frmgplot();
	void initfrm();
	void setqtjsondata(const qjsonobject & jsondata);
public slots:
	//js 调用qt函数,注意类型必须要是public slots:
	void jscallqt(const qstring &str);
private slots:
	void onpageloadfinished(bool success);
signals:
	//当qtjsondata改变时,会自动触发qtdatachanged信号
	void qtdatachanged(const qjsonobject &jsondata);
private:
	qwebengineview *m_webview;
	qwebchannel *m_webchannel;
	qjsonobject qtjsondata;
};
#include "frmgplot.h"
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
frmgplot::frmgplot(qwidget *parent)
	: qwidget(parent)
{
	//拿到示例后,别忘了在合适的时候 初始化initfrm
}
frmgplot::~frmgplot()
{
}
void frmgplot::initfrm()
{
	qvboxlayout *layout = new qvboxlayout(this);
	setlayout(layout);
	// 创建 web 视图
	m_webview = new qwebengineview(this);
	layout->addwidget(m_webview);
	// 创建 web 通道
	m_webchannel = new qwebchannel(this);
	// 注册到 web 页面,使 javascript 能够调用 qt类里面的 槽函数
	m_webchannel->registerobject("frmplot", this);
	m_webview->page()->setwebchannel(m_webchannel);//设备交互通道
	// 加载 html 页面
	qstring filepath = qfileinfo(qapplication::applicationdirpath()   "/web/gplot/js/index.html").absolutefilepath();
	m_webview->load(qurl::fromlocalfile(filepath));
	// 连接信号槽以在通道初始化后调用 javascript 函数
	connect(m_webview, &qwebengineview::loadfinished, this, &frmgplot::onpageloadfinished);
}
void frmgplot::onpageloadfinished(bool success)
{
	if (success) {
		// 页面加载完成后调用 javascript 函数
		// 创建定时器,延迟3秒后执行
		qtimer::singleshot(3000, this, [=]() {
			// 页面加载完成后调用 javascript 函数
			m_webview->page()->runjavascript(qstring("qtcalljsfunc('%1');").arg("qt call to js"));
		});
	}
}
void frmgplot::jscallqt(const qstring &str)
{
	qmessagebox::warning(this, qstring::fromlocal8bit("title"), str);
	/*示例:
	js 调用 qt 后,
	qt再次设置
	属性jsondata 的qtjsondata成员,
	让其改变 然后 触发信号qtdatachanged,从而让web 捕捉到qtdatachanged信号*/
	qjsonobject json;
	json["obj1"] = 1;
	json["obj2"] = 666.666;
	json["obj3"] = "this objstr";
	this->setproperty("jsondata", json);
	setqtjsondata(json);
}
void frmgplot::setqtjsondata(const qjsonobject &jsondata)
{
	//if (qtjsondata != jsondata)
	{
		qtjsondata = jsondata;//会自动触发qtdatachanged
	}
}
  network
   
  
   
   /*定义一个按钮*/

3:项目注意事项

3.1 :qt webengine locales directory not found at location 错误

这个警告是因为 qt webengine 在运行时需要一些 icu 数据文件,这些文件通常位于 qt 的安装目录中。警告消息显示 qt webengine 在指定的目录下找不到 icu 数据文件,因此它会尝试从其他位置加载

在 qt webengine 中,icu 数据文件主要用于处理文字排版、文字渲染、国际化以及本地化等任务。因此,运行 qt webengine 应用程序时,它会尝试加载这些 icu 数据文件,以确保在不同地区和语言环境下能够正确地显示和处理文本。

icudtl.dat 是 qt 框架使用的 icu(international components for unicode)数据文件之一。

icudtl.dat 是在qt的安装目录中的,在安装目录中搜索并且incudtl.dat和这些pak文件 复制到 执行文件相同层级目录下就可以了。*.pak 是 qt webengine 中的资源文件,它们包含了用于支持开发者工具和其他功能所需的资源。注意拷贝时,要区分 对应版本 。

qt与qwebengineview交互完整参考示例代码

3.2  运行时 崩溃例如:m_webview->page()->setwebchannel(m_webchannel);或者其他地方莫名崩溃

  qtwebengineprocess.exe 是 qt webengine 模块的一个子进程,用于在 qt 应用程序中执行 web 页面的渲染和相关任务。通常情况下,qtwebengineprocess.exe 被设计为与主应用程序(.exe 文件)放置在同一目录下,这是为了便于它与主应用程序之间共享资源和进行通信,否则会出现各种莫名崩溃问题

总结

免费资源网,https://freexyz.cn/
返回顶部
顶部
网站地图