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

Qt网络编程实例解析:涵盖图像手势、网络通信与安全套接字
本文详细介绍了Qt的多个网络编程示例,包括图像手势处理、网络配置监控、客户端服务器通信、多播、DNS查询、文件下载、安全套接字等。通过这些示例,读者可以掌握Qt中QGestureEvent、QNetworkAccessManager、QSslSocket等关键类的使用,并了解到如何进行网络会话管理、数据包发送与接收、多播组操作以及安全网络通信。

说明:

下面的XX.XX.XX为Qt的版本号,如:5.14.1。
下面总结的都是以Qt的5.14.1版本来说明的,未来的版本也许和这有些不同。
因为Qt自带的例子很多,本博文是第4部分,第1、2、3、5、6部分请参见如下链接:

1.imagegestures

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

 Examples\Qt-XX.XX.XX\widgets\gestures\imagegestures

       本工程展示利用Qt触摸手势技术实现对图片集前翻、后翻、旋转、缩放。通过本工程,需要掌握如下知识点:

  • 手势相关QGestureEvent、QPanGesture、QPinchGesture类的用法 。
  • 掌握QImageReader操作图片的用法。
  • 了解QLoggingCategory类如何管理打印日志功能,具体参见:

                《Qt使用QLoggingCategory管理打印》。

2.network

本大节展示如何利用Qt的network模块进行网络编程。存放目录为:

 Examples\Qt-XX.XX.XX\network

2.1.bearermonitor

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

 Examples\Qt-XX.XX.XX\network\bearermonitor

          本工程展示如何利用Qt的QNetworkConfiguration、QNetworkConfigurationManager、QNetworkSession类访问、获取本机的网络服务、网络访问接口、网络访问节点、网络会话。通过本工程需要掌握如下知识点:

  • Qt的QNetworkConfiguration、QNetworkConfigurationManager类访问、获取本机的网络服务、网络访问接口、网络访问节点。
  • QNetworkConfiguration、QNetworkConfigurationManager类各函数及信号作用及用法。
  • QNetworkSession类对网络会话的操作。

2.2.blockingfortuneclient

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

 Examples\Qt-XX.XX.XX\network\blockingfortuneclient

本工程演示如何通过一个网络客户端连接网络服务器端。通过本工程需要掌握如下知识点:

  • 表示主机ip地址信息的QHostAddress类用法。
  • 获取主机网卡信息的QNetworkInterface类用法。
  • QThread用法及如何子类化QThread。
  • 线程同步时用到的QMutexLocker、QWaitCondition、QMutex类的用法。

2.3.broadcastreceiver

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

 Examples\Qt-XX.XX.XX\network\broadcastreceiver

本工程演示如何通过QUdpSocket接收数据包。通过本工程需要掌握如下知识点:

  • QUdpSocket类用法及QAbstractSocket::BindFlag各个枚举值含义。
  • 如何通过QUdpSocket接收网络数据包。

2.4.broadcastsender

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

 Examples\Qt-XX.XX.XX\network\broadcastsender

本工程演示如何通过QUdpSocket发送数据包。通过本工程需要掌握如下知识点:

  • QUdpSocket类用法及QHostAddress::SpecialAddress各个枚举值含义,尤其是QHostAddress::Broadcast含义。
  • 如何通过QUdpSocket发送网络数据包。

2.5.dnslookup

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

 Examples\Qt-XX.XX.XX\network\dnslookup

本工程通过命令行输入参数,实现DNS相关信息查询。通过本工程需要掌握如下知识点:

  • 掌握QDnsLookup类的使用,如何查询DNS信息。
  • DNS查询结果QDnsDomainNameRecord、QDnsHostAddressRecord、QDnsMailExchangeRecord、
  • QDnsDomainNameRecord、QDnsServiceRecord、QDnsTextRecord类的使用。

2.6.download

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

 Examples\Qt-XX.XX.XX\network\download

本工程通过从命令行读取多个URL,将URL指向的文件下载到本地保存,通过本工程需要掌握如下知识点:

  • 利用QNetworkAccessManager类发送或接收网络请求。
  • 利用QNetworkReply类构建网络回复对象,对收到的网络回复结果(网络数据包)进行管理。
  • 利用QNetworkRequest类构建网络请求对象及如何利用QUrl构建QNetworkRequest类对象。
  • QUrl类对URL的操作。

2.7.downloadmanager

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

 Examples\Qt-XX.XX.XX\network\downloadmanager

技术点同2.6

2.8.fortuneclient

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

 Examples\Qt-XX.XX.XX\network\dfortuneclient

本工程通过QTcpSocket类连接服务器。通过本工程需要掌握如下技术点:

  • 通过QHostInfo类查询主机名称和主机绑定的IP地址,掌握QHostInfo类使用。
  • 获取主机网卡信息的QNetworkInterface类用法。
  • 表示主机IP地址信息的QHostAddress用法。
  • QNetworkConfigurationManager、QNetworkSession、QNetworkConfiguration用法。

2.9.fortuneserver

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

 Examples\Qt-XX.XX.XX\network\fortuneserver

    本工程同2.8提到的fortuneclient工程类似,只不过本工程是服务器端,通过本工程需要掌握如下技术点:

  • 通过QHostInfo类查询主机名称和主机绑定的IP地址,掌握QHostInfo类使用。
  • 获取主机网卡信息的QNetworkInterface类用法。
  • 表示主机IP地址信息的QHostAddress用法。
  • QNetworkConfigurationManager、QNetworkSession、QNetworkConfiguration用法。

2.10.googlesuggest

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

 Examples\Qt-XX.XX.XX\network\googlesuggest

        本工程实现一个类似Google的搜索下列提示框。当在搜索编辑框输入搜索内容文本时,搜索编辑框下方就出现和编辑框内容近似的搜索提示结果
提示框是通过QTreeWidget控件来实现的。类似QLineEdit的QCompleter。同百度的搜索类似,当在百度搜索时,搜索框下方也会出现很多提示搜索内容。
通过本工程需要掌握如下知识点:

  • QNetworkReply、QNetworkRequest、QNetworkAccessManager类使用。
  • QDesktopServices类的使用。
  • 如何通过QTreeWidget、QLineEdit控件的密切互动,实现搜索下拉提示结果列表。

2.11.http

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

 Examples\Qt-XX.XX.XX\network\http

本工程通过用户输入http地址表示的文件,从而将该文件下载到本地。通过本工程需要掌握如下技术点:

  • QNetworkAccessManager类的使用,尤其是该类的authenticationRequired信号的使用。
  • QNetworkRequest、QNetworkReply类使用。尤其需要关注QNetworkReply类的downloadProgress用法。
  • QUrl类的使用,尤其需要关注QUrl的fromUserInput、resolved函数用法。
  • QAuthenticator类用法。
  • QNetworkReply类重定向属性QNetworkRequest::RedirectionTargetAttribute。
  • 如何用QProgressDialog类对象来表示下载进度信息。

2.12.loopback

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

 Examples\Qt-XX.XX.XX\network\loopback

     本工程创建两个QTcpServer对象,分别作为服务器和客户端。客户端向服务器端发送报文,服务端将客户端发送的报文读取。通过本工程需要掌握如下技术点:

  • QTcpServer类函数和信号的使用,会利用该类创建服务器端和客户端。
  • 服务器端和客户端是如何进行监听、连接、数据发送、读取交互的。

2.13.multicastreceiver

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

 Examples\Qt-XX.XX.XX\network\multicastreceiver

   本工程演示利用QUdpSocket类实现多播接收端,该工程需要multicastsender工程一起联动才能看到程序效果。通过本工程,需要掌握如下技术点:

  • QUdpSocket类的使用。尤其是利用该类的joinMulticastGroup实现多播组。
  • 在IP6先利用QNetworkDatagram类对象接收报文。掌握QNetworkDatagram类的用法。

2.14.multicastsender

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

 Examples\Qt-XX.XX.XX\network\multicastsender

   本工程演示利用QUdpSocket类实现多播发送端,该工程需要multicastreceiver工程一起联动才能看到程序效果。通过本工程,需要掌握如下技术点:

  • QUdpSocket类的使用。尤其在IP4下对多播TTL的控制。
  • UDP模式下,IP4和IP6发送数据的区别,后者需要判断QUdpSocket类对象的状态为QAbstractSocket::BoundState才能发送数据。

2.15.network-chat

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

 Examples\Qt-XX.XX.XX\network\network-chat

本工程演示一个有状态的对等聊天客户端。这个例子使用QUdpSocket和QNetworkInterface广播来发现它的对等点,实现网络聊天。对本工程的详细分析参见《Network Chat Example》博文,通过本工程,需要掌握如下技术点:

  • 掌握如何通过QNetworkInterface类获取网络适配器(网卡)信息。
  • 利用Qt的qEnvironmentVariable、qgetenv函数获取系统环境变量。
  • 利用QNetworkAddressEntry类表示IP、掩码地址、广播地址。
  • QHostAddress、QTcpSocket、QCborStreamWriter、QCborStreamReader类的使用。

2.16.securesocketclient

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

 Examples\Qt-XX.XX.XX\network\securesocketclient

本工程演示如何利用QSslSocket类进行安全套接字发送报文(对发送报文加密)。通过本工程需要掌握如下技术点:

  • QAbstractSocket::SocketState枚举中的每个枚举值表示的各种套接字状态的深刻理解。
  • QSslSocket类的使用。
  • QSslCertificate类的使用。

说明:本工程启动时,如果QSslSocket::supportsSsl()返回false,导致程序不能起来,则请参考《QSslSocket::supportsSsl()返回false问题解决》博文。

2.17.secureudpclient

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

 Examples\Qt-XX.XX.XX\network\secureudpclient

本工程是客户端,需要服务端即secureudpserver一起跑才有效果。通过本工程需要掌握下列技术点:

  • QHostInfo、QUdpSocket、QHostAddress、QDtls、QNetworkInterface、QSslSocket、QSslConfiguration类的使用。
  • 一些不常用但很实用的小技术点:QComboBox类的insertSeparator方法插入分隔项;QByteArray的toHex转为16进制方法。

2.18.secureudpserver

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

 Examples\Qt-XX.XX.XX\network\secureudpserver

本工程讲解DTLS服务端技术。DTLS服务端需要结合DTLS客户端即secureudpclient一起跑才有效果。通过本工程需要掌握下列技术点:

  • QSslConfiguration、QUdpSocket、QHostAddress、QDtls、QNetworkInterface、QSslPreSharedKeyAuthenticator类的使用。
  • qExchange、std::exchange函数用法。
  • QTextEdit类插入html,以便用富文本、用不同颜色显示报文等信息。
  • Q_UNREACHABLE宏用法。

2.19.threadedfortuneserver

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

 Examples\Qt-XX.XX.XX\network\threadedfortuneserver

本工程通过QTcpServer类构建一个基于TCP的简单服务器来展示相关类及技术点的使用,通过本例子,需掌握如下技术点:

  • QTcpServer类是使用及如何子类化该类。
  • 当有客户端来链接时,如何为客户端生成一个QThread的线程子类以提供服务。
  • 通过QNetworkInterface类获取主机地址QHostAddress类。
  • 掌握QThread类的使用,关于该类的详细使用,参见《QThread、moveToThread用法详述

2.20.torrent

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

 Examples\Qt-XX.XX.XX\network\torrent

本工程实现利用种子下载程序,类似迅雷。通过本工程需要掌握如下技术点:

由于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、付费专栏及课程。

余额充值