Qt Example各例子技术点说明(五)

本文详细介绍了Qt5.14.1版本中的QWebChannel和WebEngineWidgets相关示例,包括与HTML和JavaScript的通信、QWebSocketServer的使用、QWebEngineView加载网页以及页面操作、打印和通知等功能。每个示例都涵盖了关键技术和类的使用方法。

说明:

下面的XX.XX.XX为Qt的版本号,如:5.14.1。

下面总结的都是以Qt的5.14.1版本来说明的,未来的版本也许和这有些不同。

因为Qt自带的例子很多,本博文是第5部分,第1、2、3、4、6部分请参见如下链接:

1.webchannel

本大节展示如何利用QWebChannel类及其相关类用法;实现和远程或本地的html网页或javascript进行通信和数据交互。存放目录为:

Examples\Qt-XX.XX.XX\webchannel

注:本大节中的很多例子需要懂点web的技术,才能更改理解。

1.1.chatserver

该工程存放在Qt安装目录下的

Examples\Qt-XX.XX.XX\webchannel\chatserver

本工程展示如何利用QWebSocketServer构建一个类似Web服务器,再利用QWebChannel向外部html和javascript网页客户端暴露一个QObject的对象,然后利用从派生的QWebChannelAbstractTransport子类在html和javascript网页与QWebChannel暴露的QObject的对象之间构建通信链路,以使这两者之间可以进行通信和数据交互。通过本工程需要掌握如下技术点:

  • QWebSocketServer类用法及其与QTcpServer类之间的区别和关系。

  • QWebChannelAbstractTransport类作用及如何派生子类。

  • QWebChannel类用法及通过该类的registerObject函数向外部网页端暴露QObject的对象。

  • QWebSocket类用法及其和QTcpSocket的区别。

关于这几个类的用法及之间的关系,参见:

浅谈QWebChannel、QWebChannelAbstractTransport、QWebSocketServer、QWebSocket用法及之间关系》。

说明:本例子运行步骤如下:

  1. 启动本程序,出现控制台界面。

  1. 看看目录Examples\Qt-XX.XX.XX\webchannel\chatclient-html目录下是否有qwebchannel.js文件。如果没有,则进行第3步;如果有,则进行第4步。

  1. 将Examples\Qt-XX.XX.XX\webchannel\shared\qwebchannel.js拷贝一份到 Examples\Qt-XX.XX.XX\webchannel\chatclient-html目录。

  1. 用浏览器打开Examples\Qt-XX.XX.XX\webchannel\chatclient-html\chatclient.html。在弹出的页面登录框随意输入一个字符串。

  1. 本程序控制台界面会出现登录成功信息。

1.2.standalone

该工程存放在Qt安装目录下的

Examples\Qt-XX.XX.XX\webchannel\standalone

展示的技术知识点,同1.1节的chatserver,不再详述。

2.webenginewidgets

本大节展示如何利用QWebEngineView、QWebEnginePage类及其相关类用法;实现通过Qt窗体加载html网页或javascript页面。存放目录为:Examples\Qt-XX.XX.XX\webenginewidgets

2.1.contentmanipulation

该工程存放在Qt安装目录下的

Examples\Qt-XX.XX.XX\webenginewidgets\contentmanipulation

本工程通过QWebEngineView加载http页面和js文件,展示QWebEngineView、QWebEnginePage类及其相关类用法。

通过本类需掌握如下技术点:

  • QWebEngineView、QWebEnginePage用法,通过这两个类加载js、html。

  • 利用Qt::AA_EnableHighDpiScaling设置高清屏。

2.2.cookiebrowser

该工程存放在Qt安装目录下的

Examples\Qt-XX.XX.XX\webenginewidgets\cookiebrowser

本工程展示Qt操作页面cookie技术。通过本工程,需掌握如下技术点:

  • QNetworkCookie、QWebEngineCookieStore、QWebEngineView类使用。

  • 利用Qt::AA_EnableHighDpiScaling设置高清屏。

2.3.html2pdf

该工程存放在Qt安装目录下的

Examples\Qt-XX.XX.XX\webenginewidgets\html2pdf

本工程通过QWebEnginePage类的printToPdf函数将页面转为pdf。通过本工程需掌握如下技术点:

  • QWebEnginePage类用法。

  • QWebEnginePage类的loadFinished、pdfPrintingFinished信号;printToPdf函数将页面转为pdf。

  • 利用Qt::AA_EnableHighDpiScaling设置高清屏。

  • QPageLayout类设置页面布局,如:尺寸大小、空白、页面阅读方向(竖排、横排)。

说明:本工程运行,需要设置页面http输入参数和输出pdf的存放到本地的绝对路径,如下为Visual Studio 设置的输入、输出参数:

2.4.maps

该工程存放在Qt安装目录下的

Examples\Qt-XX.XX.XX\webenginewidgets\maps

本工程通过加载谷歌地图,展示如下技术点用法:

  • QWebEngineView、QWebEnginePage类用法。

  • QWebEnginePage的featurePermissionRequested信号含义。

  • QWebEnginePage::PermissionPolicy、QWebEnginePage::Feature枚举变量含义。

  • 利用Qt::AA_EnableHighDpiScaling设置高清屏。

2.5.markdowneditor

该工程存放在Qt安装目录下的

Examples\Qt-XX.XX.XX\webenginewidgets\markdowneditor

本工程实现一个markDown编辑器,通过本工程,需掌握如下技术点:

  • QWebEnginePage类作用及如何子类化。

  • QPlainTextEdit类用法。

  • 利用Qt::AA_EnableHighDpiScaling设置高清屏。

2.6.minimal

该工程存放在Qt安装目录下的

Examples\Qt-XX.XX.XX\webenginewidgets\minimal

本工程实现用QWebEngineView类加载一个页面到Qt窗体进行展示。通过本工程需掌握如下技术点:

  • QWebEngineView类用法。

  • 利用Qt::AA_EnableHighDpiScaling设置高清屏。

2.7.notifications

该工程存放在Qt安装目录下的

Examples\Qt-XX.XX.XX\webenginewidgets\notifications

本工程展示如何将Html5页面通知发送到Qt窗体。要弄懂本工程,需先了解Html5页面通知技术。关于该技术,请参考《聊聊HTML5中的Web Notification桌面通知》。通过本工程,需掌握如下技术点:

  • 如何利用QWebEngineNotification类和html5消息进行交互。

  • QWebEnginePage类的用法及如何子类化该类;特别是该类的featurePermissionRequested信号及setFeaturePermission函数用法。

  • QWebEngineView类用法。

  • 利用Qt::AA_EnableHighDpiScaling设置高清屏。

在Qt Assistant索引页的查找框输入QWebEngineNotification,在对该类的详细描述中,可以找到Qt官方对该工程的详细说明,如下:

2.8.printme

该工程存放在Qt安装目录下的

Examples\Qt-XX.XX.XX\webenginewidgets\printme

该工程展示如何打印页面。通过本工程需掌握如下技术点:

  • QWebEngineView类用法。

  • QWebEnginePage类用法。特别是该类printRequested信号用法。

  • 打印相关类用法,如:QPrinter、QPrintPreviewDialog、QPrintDialog用法。

  • 利用Qt::AA_EnableHighDpiScaling设置高清屏。

2.9. simplebrowser

该工程存放在Qt安装目录下的

Examples\Qt-XX.XX.XX\webenginewidgets\simplebrowser

该工程展示如何用Qt实现一个简单的浏览器。可以通过该浏览器浏览页面、下载文件等。通过本工程需要掌握如下技术点:

  • QWebEngineSettings类设置web各种属性。

  • QWebEngineProfile类用法。

  • QWebEnginePage、QWebEngineView类用法。

  • 利用Qt::AA_EnableHighDpiScaling设置高清屏。

  • 本例子将QKeySequence用到了极致,是学习QKeySequence类的不可多得的例子。

  • 用于管理下载的QWebEngineDownloadItem类的用法。

2.10. stylesheetbrowser

该工程存放在Qt安装目录下的

Examples\Qt-XX.XX.XX\webenginewidgets\stylesheetbrowser

该工程展示如何在web页面运行一段javasript代码来改变页面风格,如:让页面旋转180°。通过本工程,需要掌握如下技术点:

  • QWebEngineView类用法,例如:该类的urlChanged信号。

  • QWebEnginePage类用法及调用runJavaScript函数运行一段javaScript代码,实现对页面的更改。

  • QWebEngineScript类用法,如何用该类封装一段javascript。

  • qMakePair函数的作用,功能同std::make_pair。

2.11.webui

该工程存放在Qt安装目录下的

Examples\Qt-XX.XX.XX\webenginewidgets\webui

平常用的一般为http、https、FTP协议等,但本工程通过实现自定义配置URL的Scheme,如:webui:about。通过本工程需要掌握如下技术点:

  • 如何通过QWebEngineUrlScheme类实现自定义配置URL的Scheme。

  • 如何通过QWebEngineUrlSchemeHandler类实现对自定义配置URL的Scheme的处理。

  • QWebEngineProfile、QWebEnginePage、QWebEngineView用法及之间的关系。

由于Qt官方自带的例子很多,一下看不完,每看完一个例子,记录一个。未完,待续!

<think>好的,我现在需要处理用户的问题,关于Qt例子中出现的错误信息:“this example requires qt to be configured with -opengl desktop”。用户希望了解如何解决这个问题,或者得到相关的介绍。首先,我需要确定这个错误的原因,以及解决方法。 首先,我应该回忆一下Qt的OpenGL支持情况。Qt在渲染图形时,可以使用不同的后端,比如OpenGL或Raster(软件渲染)。某些Qt例子或应用程序可能依赖特定的OpenGL功能,尤其是桌面版的OpenGL,而不是OpenGL ES,这通常在嵌入式或移动设备上使用。错误信息提示需要配置Qt时启用桌面版的OpenGL支持,这可能是因为当前的Qt构建使用的是OpenGL ES或者其他不兼容的后端。 接下来,用户可能在尝试编译或运行某个Qt示例时遇到了这个错误。常见的情况是,用户可能在Linux系统下,或者在某些配置不包含桌面OpenGL的环境中使用Qt。例如,某些Linux发行版的Qt包可能默认使用OpenGL ES,或者用户在配置Qt时没有启用桌面OpenGL。 那么,解决方法应该是重新配置Qt并加上-opengl desktop选项,然后重新构建Qt。但需要注意,Qt从5.5版本以后,配置选项有所变化。-opengl选项可能在较新的版本中不再有效,而是需要通过其他方式指定OpenGL的实现。例如,在较新的Qt版本中,可能需要使用-qt-opengl desktop或其他参数,或者可能需要确保系统安装了正确的OpenGL开发包。 这时候需要分情况讨论。如果用户使用的是Qt 5.5或更早版本,可能确实可以通过在configure时添加-opengl desktop来解决。但如果是较新的版本,可能需要不同的步骤,比如安装mesa的OpenGL开发库,或者在配置时选择适当的选项。 另外,还需要考虑用户的操作系统。例如,在Windows上,OpenGL的支持可能依赖于安装的显卡驱动和SDK;而在Linux上,可能需要安装mesa-common-dev或类似的软件包。在macOS上,通常Qt会使用系统自带的OpenGL,但可能需要确认Xcode命令行工具是否安装。 此外,用户可能需要确保他们的系统支持桌面版OpenGL。例如,某些嵌入式系统或服务器环境可能没有安装相应的图形驱动,导致无法使用桌面OpenGL。 可能还需要检查Qt的构建配置是否正确。用户可能从源码构建Qt,或者在安装预编译的Qt包时选择了不包含OpenGL desktop支持的版本。例如,在Linux上,使用apt-get安装的Qt可能默认不带OpenGL桌面支持,需要从源码编译并配置相应的选项。 另外,可能的替代方案是,如果用户无法重新配置Qt,可以尝试修改示例代码的渲染后端,但这可能比较复杂,特别是对于不熟悉Qt内部机制的用户来说,重新配置Qt可能是更直接的解决方案。 总结处理步骤应该是: 1. 确认Qt版本,检查对应的配置选项是否需要-opengl desktop或其他参数。 2. 确保系统已安装所需的OpenGL开发库。 3. 重新配置Qt并启用桌面OpenGL支持,然后重新构建Qt。 4. 重新编译和运行示例程序,验证问题是否解决。 还需要注意可能的常见错误,例如配置参数的位置是否正确,构建环境是否干净,是否有旧的Qt构建残留导致问题,以及权限问题等。 可能用户没有从源码构建Qt的经验,因此需要详细说明如何下载Qt源码,运行configure命令,并执行后续的构建步骤。同时,提醒用户这个过程可能需要较长时间,并且需要安装必要的依赖库。 另外,如果用户不需要修改Qt的配置,是否有其他方法绕过这个问题?例如,使用软件渲染或其他渲染后端,但某些示例可能硬性依赖OpenGL功能,无法绕过。 最后,需要验证这些步骤的正确性,确保给出的建议适用于大多数情况,特别是用户可能使用的不同操作系统和Qt版本。</think>当遇到Qt示例提示`this example requires qt to be configured with -opengl desktop`时,通常是因为当前Qt库未启用桌面版OpenGL支持。以下是详细解决方法: --- ### **问题原因** 1. **Qt的OpenGL后端配置不匹配** 部分Qt图形示例(如OpenGL相关示例)依赖**桌面版OpenGL**(Desktop OpenGL),而非嵌入式版本(OpenGL ES)。 2. **Qt构建时未启用桌面OpenGL** 若Qt在编译时未通过`-opengl desktop`配置,可能导致相关功能缺失。 --- ### **解决方法** #### **步骤1:确认Qt版本与系统环境** - **Qt版本**:低于5.5的版本需显式配置`-opengl desktop`;5.5及更高版本可能需其他方式(见下文)。 - **操作系统依赖**: - **Linux**:安装OpenGL开发库(如Mesa): ```bash sudo apt-get install mesa-common-dev libgl1-mesa-dev ``` - **Windows/macOS**:确保显卡驱动支持OpenGL,并安装对应SDK(如Windows的[OpenGL SDK](https://www.opengl.org/))。 --- #### **步骤2:重新配置并编译Qt** 1. **下载Qt源码** 从[Qt官方下载页](https://download.qt.io/)获取对应版本源码。 2. **配置时启用桌面OpenGL** 在终端中运行以下命令(以Qt 5.5为例): ```bash ./configure -opengl desktop ``` - **新版本Qt(5.15+)**:改用`-qt-libpng`等参数,或确保系统OpenGL库已正确链接: ```bash ./configure -system-opengl ``` 3. **编译并安装Qt** ```bash make -j4 # 根据CPU核心数调整并行编译数(如-j8) sudo make install ``` --- #### **步骤3:验证配置** 1. **检查Qt的OpenGL支持** 运行Qt示例前,通过以下代码片段验证OpenGL类型: ```cpp #include <QOpenGLContext> QOpenGLContext ctx; ctx.create(); qDebug() << "OpenGL Type:" << ctx.isOpenGLES() ? "OpenGL ES" : "Desktop OpenGL"; ``` 2. **重新编译示例** 清理旧构建并重新编译: ```bash make clean && qmake && make ``` --- ### **常见问题** 1. **错误:`Could not create OpenGL context`** - 系统缺少OpenGL驱动,更新显卡驱动或安装`mesa-utils`(Linux)。 - 虚拟机用户需启用3D加速(如VirtualBox中勾选“启用3D加速”)。 2. **Qt预编译包问题** 某些预编译Qt包(如Linux发行版仓库中的版本)可能默认禁用OpenGL桌面支持。建议从源码编译。 --- ### **替代方案** 若无法重新编译Qt,可尝试: 1. **强制使用软件渲染**(仅限部分场景): ```bash export QT_XCB_FORCE_SOFTWARE_OPENGL=1 ``` 2. **修改示例代码**:将`QSurfaceFormat::setRenderableType(QSurfaceFormat::OpenGL)`替换为兼容类型(需熟悉Qt图形模块)。 --- 通过以上步骤,您应能解决因OpenGL配置导致的Qt示例运行问题。如仍报错,请检查系统日志或Qt的编译日志以获取详细信息。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值