《操作系统实践-基于Linux应用与内核编程》第10章--实验 Qt聊天程序

news2024/12/24 0:02:11

 前言:

内容参考《操作系统实践-基于Linux应用与内核编程》一书的示例代码和教材内容,所做的读书笔记。本文记录再这里按照书中示例做一遍代码编程实践加深对操作系统的理解。

引用:

《操作系统实践-基于Linux应用与内核编程》

作者:房胜、李旭健、黄玲、李哲

出版社:清华大学出版社

资源:

 教材资源

链接: https://caiyun.139.com/m/i?1A5Ch36dl1whD  提取码:jdQe

课件和电子资料源码

链接: https://caiyun.139.com/m/i?1A5CvEKY07Uzs  提取码:xyv0

参考链接:

Qt 之网络编程_qt网络编程-CSDN博客

[QT_047]Qt学习之表单布局器(QFormLayout)-CSDN博客

正文

1. 登录窗口源码

参考电子资源中的源码 '' ch10/QChat/qdlglog.in.cpp",完善Qt聊天程序登录页面的源码。

在Qt Creator 点击 qdlglogin.cpp ,进入编辑页面,参考源码示例增加需要引入的头文件

#include "qdlglogin.h"
#include "ui_qdlglogin.h"

//Add by dimon 2024/-0316 14:32, Copy the source code
#include "qdlggchat.h"
#include "common.h"
#include <QMessageBox> //弹出对话框
#include <QHostAddress>

此时发现 Qt Creator 提示错误,说找不到 'QHostAddress'头文件。原因是我们的Qt 项目需要用到 Qt 网络模块,而当前我们还没有引入 Qt 网络模块。

解决方案,参考链接博文,在项目 ".pro"文件中加入一行,在Qt项目中引起 Qt Network 模块,这样Qt Creator 就能找到 "QHostAddress"头文件了。

QT += network

Qt 之网络编程_qt网络编程-CSDN博客文章浏览阅读2.7w次,点赞21次,收藏38次。Qt Network模块提供的类允许编写 TCP/IP clients 和 servers。_qt网络编程https://blog.csdn.net/liang19890820/article/details/52249509

修改 qdlglogin.h 头文件,需要用到 Qt "QTcpSocket" 类,在qdlglogin.h文件头加上对 QtcpSocket的包含。Qt Creator只有在包含对应的头文件后,在Qt Crateor编辑器里才能智能提示补全头文件里的函数,类。

#ifndef QDLGLOGIN_H
#define QDLGLOGIN_H

#include <QDialog>
#include <QTcpSocket> //QTcpSocket头文件

在 qdlglogin.h 中类 class qdlglogin 中加上 private 私有成员,登录页面中需要记录的用户ID,密码,服务器IP,服务器端口号,以及 *tcpSocket指针。

修改 qdlglogin.cpp的类构造函数,在构造qdlglogin登录对话框时,设置‘用户名’和‘密码’文本输入框的'LineEdit'的提示符,和密码输入文本对话框'LineEdit’的回显模式为 'LineEdit::Password'对密码做特殊回显。设置登录对话框的“登录”和“注册”按钮"QPushButton'初始化为非Enable模式,灰化不可以点击。

效果如下图

2. Qt布局器的使用

在设置qdlgchar.ui窗体的布局是,使用到了Qt Creator设计师界面的 Qt 布局器,Qt布局器可以使用的有水平布局,和垂直布局。

[QT_047]Qt学习之表单布局器(QFormLayout)-CSDN博客文章浏览阅读3.8k次,点赞2次,收藏17次。Qt学习之表单布局器(QFormLayout)_qformlayouthttps://blog.csdn.net/kongcheng253/article/details/128781000

Qt 布局器的使用技巧是:

1. 第一种方法,直接拖动Qt设计师界面到布局器到ui设计界面,然后拖动需要的widget组件到布局器。实际操作拖动之后,就会发现使用鼠标拖动窗体小组件widget到布局器的方式分非常容易误操作,总是不能选择到想要的小组件,或者小组件在布局器里自动排序出错等。

2. 第二种方法,是参考如上链接中的方法,先一次选中多个需要布局的窗体小组件,点击Qt ui设计菜单上的“打破布局”,破坏原有的布局;然后点击窗体菜单“水平布局”或者“垂直布局”,所选中的多个小组件就会自动加入到Qt布局器中。

注意:小组件被加入到布局器中之后,小组件的大小就不能调整了。如果想要再次调整小组件的大小,可以先选择小组件所在的父布局器 点击“破坏布局”,去掉布局之后就可以单独调整小组件的大小。调整小组件大小到之后,再把组件加入到Qt布局器。

点击右键“选择全部”会选择全部的窗体小组件, 然后点击“水平布局”,选择到的组件就都被加入到“水平布局器”中。

技巧1: 单击小组件的时候,总是会选择到Qt布局器里的一个小组件,有时间我们是想去选中整个Qt布局器。此时可以在ui设计界面右侧的窗体里用鼠标选择它的上一级布局器,就可以很容易的选择到父布局器。

技巧2:按下Ctrl键,鼠标单击右侧窗口中的布局器1,再单击布局器2,就会一次同时选择多个布局器。

3. 聊天窗口源码

参考源码实现 qdlggchar.cpp 的源码。需要设置的 comboBox , toolButton 等设置发送 txtEdit 组件中的字体的“字体”,“加粗”,“倾斜”,“颜色” 等 button关联的槽函数时,进入Ui设计界面,鼠标右键“转到槽”,实现槽函数(从示例代码中抄过来)。通过抄写示例代码的过程,实现了 qdlggchat.cpp 窗体的中按钮逻辑,也进一步接触和实践使用Qt来编程实现需要的功能。

4. 添加聊天服务器项目

新建项目,“QWidgetApplcation”,选择基类QDiaglog

使用Qt布局器,设计Qt聊天服务器的窗体布局。

参考电子资源中的示例源码,添加文件(类)qmydb.cpp(.h), qserver.cpp(.h), qthread.cpp(.h), quser.cpp(.h) 

右键单击"QChatServer"项目,"Add New",“Add C++ Class”,类命名为"qmydb",基类选贼为"QObject",确定,自动生成 qmydb.cpp 源文件和 qmydb.h头文件。

相同的操作,添加"qserver,quser, qthread, qserver” C++ 类的源文件和头文件。

注意: 如果Qt Creator 有多个项目打开,选择“添加到项目”是需要下拉框选择添加到指定的目标Qt项目。如果保持默认可能把文件会添加到不是自己想要的项目中。

4.1 服务器qmydb 数据库连接类

参考电子资源QChatServer源码中 qmydb 类,抄写源码到我们的Qt聊天服务器项目中。

添加头文件时,Qt Creator编辑器提示找不到"QSqlDatabase"头文件,原因项目用到了Qt数据库模块,但还没有把Qt数据库模块引入到我们QChatServer项目中。

如何查看,我们需要引入哪个Qt 数据库模块?

方式是查看Qt提供的帮助手册,在Qt帮助手册中会说明如果我们需要使用某个Qt模块,需要在项目中如何引入该模块。一般是在项目的 “.pro”文件中加上

Qt += xxx(模块名)

点击Qt Creator编辑器左侧菜单栏“帮助”,进入Qt 帮助文档,点击左下的过滤选择下拉框,下拉框里提供了“索引,查抄,书签,打开页面” 这4个选项。如果需要根据关键字搜索Qt 帮助文档,可以下拉框选择“查找”,输入关键字(例如 qsql),就会出现搜索结果,在搜索结果的帮助文档的起始部分,很明确的告诉我们如果书需要使用 Qt Sql模块需要包含头文件"QSqlDatabase",并且工程中需要在QMake中"QT += sql"引入sql模块(修改项目的 .pro文件,在文件结尾加上 QT += xxx)。


Header:
#include <QSqlDatabase> 

qmake:
QT += sql

 

我们QChatServer聊天服务器需要用到Qt Sql模块和Qt Network模块,所以在 QChatServer.pro 文件尾部加上如下的两行,就在我们的聊天服务器项目中引入了Qt sql和network项目。

4.2 服务器qtcpthread 处理tcp连接线程
4.3 服务器qserver类
4.4 服务器quser类

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1523595.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

15届蓝桥杯第三期模拟赛所有题目解析

文章目录 &#x1f9e1;&#x1f9e1;t1_奇数次数&#x1f9e1;&#x1f9e1;思路代码 &#x1f9e1;&#x1f9e1;t2_台阶方案&#x1f9e1;&#x1f9e1;思路代码 &#x1f9e1;&#x1f9e1;t3_约数个数&#x1f9e1;&#x1f9e1;思路代码 &#x1f9e1;&#x1f9e1;t4_最…

特殊文本文件、日志技术

特殊文件 为什么要用这些特殊文件&#xff1f; 存储多个用户的&#xff1a;用户名、密码 特殊文件:Properties属性文件 特点&#xff1a; 都只能是键值对键不能重复文件后缀一般是.properties结尾的 作用&#xff1a;存储一些有关系的键值对数据 Properties 是一个Map集合(键…

Ubuntu Argoverse API安装

1. 创建并进入conda环境 conda create -n Argoverse python3.8 conda activate Argoverse2. 拉取argoverse-api源码 git clone https://github.com/argoai/argoverse-api.git3. 下载高精地图 Download hd_maps.tar.gz from Argoverse 4. 安装api cd argoverse-api pip in…

STM32 Simulink 自动代码生成电机控制——霍尔有感六步方波仿真到开发板运行

目录 前言 方波控制理论 仿真 代码集成到开发板运行 总结 前言 回想以前在学校手写代码实现方波控制&#xff0c;花了不少时间。现在各大MCU厂家都有自己的有感或者无感方波控制的方案。这次尝试用Simulink来完成应用层算法的仿真再到代码生成开发板运行的完整流程。 方波…

达梦数据库管理

一、表空间管理介绍 在 DM 数据库中&#xff0c;表空间由一个或者多个数据文件组成。 DM 数据库中的所有对象在逻辑上都存放在表空间中&#xff0c;而物理上都存储在所属表空间的数据文件中。 DM数据库中的表空间可以分为普通表空间和混合表空间。普通表空间不能存储HUGE表&…

《IEEE Transactions on Robotics》发表!北京大学研究团队推出具有多种运动模态的软体两栖机器人

两栖机器人以其在复杂水陆混合环境中的卓越适应性而脱颖而出&#xff0c;成为非结构化场景下信息监测、资源勘探和灾难救援等多元化任务的理想选择。凭借能够在水生和陆生环境中自如切换的优势&#xff0c;两栖机器人在如上任务执行过程中展现出对多变环境的惊人适应能力。 在…

【Godot4.2】颜色完全使用手册

概述 本篇简单汇总Godot中的颜色的构造和使用&#xff0c;内容包括了&#xff1a; RGB、RGBA&#xff0c;HSV以及HTML16进制颜色值、颜色常量等形式构造颜色颜色的运算以及取反、插值用类型化数组、紧缩数组或PNG图片形式存储多个颜色 构造颜色 因为颜色是一种视觉元素&…

配置Web运行环境与第一个网页

安装与配置Web环境: 如下使用了VSC作为web的运行环境。 下面是VSC的官网:Download Visual Studio Code - Mac, Linux, Windowshttps://code.visualstudio.com/download 进入官网后按照自己的系统下载&#xff0c;我下载的是Windows. 下载完之后双击打开。 接下来就是安装&…

探讨TCP的可靠性以及三次握手的奥秘

&#x1f31f; 欢迎来到 我的博客&#xff01; &#x1f308; &#x1f4a1; 探索未知, 分享知识 !&#x1f4ab; 本文目录 1. TCP的可靠性机制1.2可靠性的基础上,尽可能得提高效率 2. TCP三次握手过程3. 为何不是四次握手&#xff1f; 在互联网的复杂世界中&#xff0c;TCP&am…

Autosar Crypto Driver学习笔记(二)

文章目录 Crypto DriverFunction definitionsGeneral APICrypto_InitCrypto_GetVersionInfo Job Processing InterfaceCrypto_ProcessJob Job Cancellation InterfaceKey Management InterfaceKey Setting Interface密钥设置接口Crypto_KeyElementSetCrypto_KeySetValid Key Ex…

Linux操作系统及进程(一)

一、操作系统的概念 概念 &#xff1a;任何计算机系统都包含一个基本的程序集合&#xff0c;称为操作系统(OS)。笼统的理解&#xff0c;操作系统包括&#xff1a; 内核&#xff08;进程管理&#xff0c;内存管理&#xff0c;文件管理&#xff0c;驱动管理&#xff09; 其他程…

Redis淘汰策略,持久化和集群

Redis淘汰策略 Redis 的 OBJECT 命令提供了多个子命令&#xff0c;用于检查有关键的内部详细信息。以下是可用的子命令及其描述&#xff1a; ENCODING <key>&#xff1a;返回用于存储与键关联的值的内部表示类型。 FREQ <key>&#xff1a;返回键的访问频率索引。返…

并查集

数据结构、算法总述&#xff1a;数据结构/基础算法 C/C_禊月初三的博客-CSDN博客 并查集是一种用于管理元素所属集合的数据结构&#xff0c;实现为一个森林&#xff0c;其中每棵树表示一个集合&#xff0c;树中的节点表示对应集合中的元素。 基本操作&#xff1a; 初始化&…

Windows→Linux,本地同步到服务器

适用背景&#xff1a; 用自己电脑修改代码&#xff0c;使用实验室/公司的服务器炼丹的朋友 优势&#xff1a; 本地 <--> 服务器&#xff0c;实时同步&#xff0c;省去文件传输的步骤 本地改 -> 自动同步到服务器 -> 服务器跑代码 -> 一键同步回本地&#xff…

Elasticsearch:调整搜索速度

在我之前的文章 “Elasticsearch&#xff1a;如何提高查询性能” 及 “Elasticsearch&#xff1a;提升 Elasticsearch 性能” 里&#xff0c;我详细描述了如何提高搜索的性能。在今天的文章里&#xff0c;我从另外一个视角来描述如何调整搜索的速度。希望对大家有所帮助&#x…

Python之Web开发中级教程----搭建虚拟环境

Python之Web开发中级教程----搭建Web框架二 搭建虚拟环境 虚拟环境的作用 虚拟环境可以搭建独立的python运行环境, 使得单个项目的运行环境与其它项目互不影响. 搭建虚拟环境 &#xff08;1&#xff09;安装 sudo pip install virtualenv sudo pip install virtualenvwra…

【LabVIEW FPGA入门】定时

在本节学习使用循环计时器来设置FPGA循环速率&#xff0c;等待来添加事件之间的延迟&#xff0c;以及Tick Count来对FPGA代码进行基准测试。 1.定时快捷VI函数 在FPGA VI中放置的每个VI或函数都需要一定的时间来执行。您可以允许操作以数据流确定的速率发生&#xff0c;而无需额…

科研学习|论文解读——交替协同注意力网络下基于属性的情感分析 (IPM, 2019)

论文题目 Aspect-based sentiment analysis with alternating coattention networks 摘要 基于属性的情感分析&#xff08;ABSA&#xff09;旨在预测给定文本中特定目标的情感极性。近年来&#xff0c;为了获得情感分类任务中更有效的特征表示&#xff0c;人们对利用注意力网络…

使用kettle导入Elasticsearch数据库

资源文件&#xff1a; 操作步骤&#xff1a; 1、删除data-integration\lib 下 所有 jackson- 开头的jar包&#xff0c;然后把jackson-2.8.10-libs文件夹中的jar拷到lib目录下 2、替换data-integration\plugins\elasticsearch-bulk-insert-plugin文件夹 3、如果开启了ssl认证…

Spring6--IOC反转控制 / 基于XML管理bean

1. 容器IOC 先理解概念&#xff0c;再进行实际操作。概念比较偏术语化&#xff0c;第一次看可能看不懂&#xff0c;建议多看几遍&#xff0c;再尝试自己独立复述一遍&#xff0c;效果会好些 1.1. IOC容器 1.1.1. 控制反转&#xff08;IOC&#xff09; IOC (Inversion of Con…