- 博客(32)
- 收藏
- 关注
原创 编译方法及工具
步骤:代码写好后,先通过gcc -g进行编译代码,没有错误后,可以通过gdb a.out进行调试,输入l查看文件内容,通过b设置断点,输入r进行运行,n或s进行单步调试,q退出。动发现更新过的文件而减少编译的工作量,同时,它通过读入Makefile文件文件的内容来执行大量的编译工作。链接库文件,将不可执行的二进制文件转换成可执行的二进制文件。#开头内容,展开头文件,替换宏定义,不会进行语法检查。检查语法错误,词法错误,将.i文件转换成.s汇编文件。make:工程管理器,顾名思义,是指管理较多的文件。
2024-10-24 19:25:04
628
原创 opencv
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉库,它提供了丰富的图像处理和计算机视觉功能。该库由英特尔公司发起,并在 BSD 许可证下发布,因此它是免费的,且开放源代码。10. 新建一个Qt项目验证环境搭建的有效性,新建Qt项目后,在.pro文件中添加OpenCV的路径。Qt是兼容C++的,且提供了UI界面,因此调用OpenCV进行图像处理非常合适。2. 进入Win的“我的电脑”,鼠标右键,点击“属性”。6. 在弹出的窗口中点击“新建”。
2024-10-22 18:50:59
1029
原创 多线程
之前数据库就是一种数据持久化的方式,但是虽然嵌入式使用的SQLite数据库已经是轻量级数据库,但是相对于其他技术,还是一种比较“重”的数据持久化方式。,如果子线程的run函数需要用到UI的相关参数,需要主线程(父对象)给子线程(子对象)传参(成员函数)。// 开始存储,不同类型的数据建议使用此函数(相同类型也可以,但是性能不如上面的好),以组方式存储。// 此函数相当于子线程的主函数,调用start函数后,新创建的线程自动调用此函数。7. 在run函数的函数体中,编写子线程要执行的逻辑。
2024-10-21 19:04:42
1373
原创 QFileDialog 文件对话框
与QMessageBox一样,QFileDialog继承了QDialog,是一个用于选择要打开或保存的文件(目录)的模态对话框。因此也使用静态成员函数进行弹窗,对话框的结果(选择的文件或目录的路径)也通过返回值表达。在默认情况下,Qt只有一个线程,也被成为主线程(UI线程),此线程主要的任务保证Qt程序正常执行、UI正常显示与交互。// 返回值:携带读取数据的字节数组,QByteArray是Qt的字节数组类。// 返回值:实际写出的写出的字节数,-1表示错误。// 获得要打开或保存的单文件路径。
2024-10-20 16:30:00
3400
原创 parent参数
parent参数除了有之前父窗口的界面效果外,还体现了Qt的内存管理策略。parent参数的对象是当前创建的对象的父对象。因此在Qt中存在父对象与子对象的概念,需要注意的是,此处的父子关系与继承无关,至于parent参数有关。子对象会跟随父对象的销毁而销毁,子对象不需要手动delete。事件是Qt运行的底层逻辑,在程序运行的过程中是逐层传递,通常在Qt程序中由QApplication对象优先处理和分发。以常见的用户操作事件为例,说明事件的传递机制。// 鼠标按压事件函数。// 鼠标释放事件函数。
2024-10-19 09:00:20
1313
原创 qt继承结构
所有的窗口类均继承自QWidget类,因此QWidget类本身包含窗口的特性。QWidget对象本身既可以作为独立窗口,又可以作为组件(子窗口)。QStackedWidget包含多个QWidget子窗口,同时只能显示一个,子窗口之间可以翻页切换显示。当创建项目时,基类选择QWidget,此时自带的窗口w对象就是继承自QWidget的独立窗口效果。窗口标记,可以设置一些枚举值,给窗口不同的显示效果,如果要同时设置多个标记,可以使用 | 分隔。// 参数1:使用默认值0时,创建的对象为独立窗口。
2024-10-18 18:39:13
1212
原创 QString 字符串类
这些容器类是隐式共享和可重入的,而且它们进行了速度和存储优化,因此可以减少可执行文件的大小。QList 是最常用的容器类,虽然它是以数组列表的形式实现的,但是在其前或后添加数据非常快,QList以下标索引的方式对数据项进行访问。,支持常见各国字符,因此一个字符是一个16位的QChar,而不是之前C++/C中8位的char,因此QString处理中文没有问题,且一个汉字算作一个字符。如果是一次性定时器,此属性表示延迟时间;QString的API非常多,以下是常用API的相关词汇,需要做到英译汉的水平。
2024-10-17 18:43:17
2160
原创 qt页面设计
如果按钮比较多需要很多信号槽的连接,除了可以使用多对一的连接方式以外,还可以使用QButtonGroup对按钮进行分组,可以针对一个组设置信号槽。信号函数分为四组,对应的触发效果就是之前QAbstractButton信号的四种效果,区别每组重载函数的参数不同。C++程序员通常不会单独启动Designer,如果要在项目中使用Designer程序,只需要在新建项目时,勾选“创建界面文件”选项。可以把布局看做是一个透明的盒子,内部放置各种组件对象,这些组件对象会按照布局预设的规则自动排序,并形成一个布局整体。
2024-10-16 17:11:07
3019
原创 c++信号槽
这种连接方式是使用的最多的一种连接方式,因为在实际开发中,Qt无法预设所有的槽函数情况,对于复杂的操作执行逻辑,需要程序员手动编写槽函数。槽函数是一种特殊的成员函数。这种连接方式是最简单的连接方式,因为信号函数和槽函数都是Qt内置的,程序员只需要找到连接的四个参数,直接连接即可。多对一的连接方式下,槽函数无法区分信号来源,可以在槽函数中调用sender函数获取发射者对象,从而判断信号来源。槽函数也是成员函数,因此在一对多的连接关系中,把连接的多个槽函数可以看做是普通的成员函数,合并为一个槽函数。
2024-10-15 16:58:06
1350
原创 ui入门
Access functions表示此属性的读写相关函数,即setter和getter,另外还可能包含其他的读写函数,Qt中属性的getter往往都是与属性同名的函数,setter往往都是set+属性名;在计算机中颜色最常见的表示方式是RGB(Red、Green、Blue)记色法,每个颜色的光线亮度被称为一个通道,每个通道是8位(256个梯度)的,即0-255,0表示当前通道黑暗,255表示当前最亮。创建的子组件默认在父窗口的左上角,子组件位置的坐标系就是整个窗口,窗口的左上角就是原点。
2024-10-14 20:23:26
1187
原创 qt入门介绍
Qt除了可以绘制漂亮的界面外,还包含很多其他的功能:多线程、数据库、图像处理、音视频处理、网络通信、文件IO等。此文件是Qt项目基于当前运行环境生成的用户文件,每个项目、每台计算机的此文件都不通用,在传输项目之间建议删除此文件,如果拿到他人的项目包含此文件,需要在导入项目之前先删除。#include <QApplication> // Qt内置类都是Q开头的。//QApplication类管理GUI应用程序的控制流程和主要设置。// Dialog类是项目自动编写的类型。Dialog类的样式,此文件非必须。
2024-10-12 20:26:48
1041
原创 c++智能指针
智能指针的原理是通过一个栈内存的智能指针对象,控制被管理的堆内存对象生命周期,当栈内存的智能指针对象销毁时,在析构函数中释放被管理管理的堆内存对象。每个shared_ptr内部都多一个隐藏的成员变量,这个变量通常被称为“引用计数”,每多一个shared_ptr持有资源就计数+1,每少一个shared_ptr持有资源就计数-1,当计数从1变为0时,释放资源。weak_ptr本身无法独立工作,但是可以配合shared_ptr进行工作,weak_ptr对资源对象的管理是一种“弱引用”,因为不会影响引用计数。
2024-10-11 19:11:29
1084
原创 c++抽象类 abstract class
之前提到抽象类型不能被声明,但是由于抽象类支持多态,因此抽象类的指针和引用可以被声明。一个概念,并不与具体的对象联系,通常为它的派生类提供一个算法框架。需要注意的是,抽象类不光没有对象,也不能声明此类型,即。用法二:派生类继承抽象基类后,没有把所有的纯虚函数覆盖并增加函数体,此时相当于继承了纯虚函数,此派生类也变为抽象类。用法一:派生类继承抽象基类,把所有的纯虚函数覆盖并增加函数体。// Shape s;// Shape s;// Shape s;// Shape s;
2024-10-09 19:05:03
847
原创 类型转换 C++11
一、static_castC++11提供了四种适用于不同场景的强制类型转换函数:static_cast 静态转换dynamic_cast 动态转换const_cast 常量转换reinterpret_cast 重解释转换usingnamespacestd;return0;static_cast没有运行时类型检查来保证转换的安全性,需要程序员判断转换是否安全。
2024-10-09 18:57:37
1117
原创 c++ 多态
虚函数的格式:virtual 返回值类型 函数名 (参数表){}* @param a 基类指针,传递堆内存对象。* @param a 基类引用,传递栈内存。// 根据传入参数的类型不同,执行不同代码。// 根据传入参数的类型不同,执行不同代码。(函数重写)override。一个接口,多种状态”
2024-10-08 17:00:31
924
原创 c++透传构造
委托构造本身可以脱离继承使用,指的是在某个类中构造函数A可以调用构造函数B。在继承中就可以让构造函数A调用构造函数B,构造函数B透传调用基类的构造函数,这样构造函数A就间接调用了基类的构造函数。// 构造函数A委托调用构造函数B(Son的二参构造函数)// 构造函数A委托调用构造函数B(Son的二参构造函数)// 通过透传构造调用基类的一参构造函数。// 通过透传构造调用基类的二参构造函数。// 通过透传构造调用基类的二参构造函数。// 构造函数B委托调用构造函数A。继承构造(C++11)
2024-10-07 21:31:12
1182
原创 c++泛型编程
STL的代码从广义上讲分为三类:algorithm(算法)、container(容器)和iterator(迭代器),几乎所有的代码都采用了模板类和模板函数的方式,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。容器是存储数据的集合,存储的数据元素可以是任何类型,因为容器是模板实现的。vector内部通过数组实现,但是vector是可变长的,因此每次长度变化时,内部重新创建数组,能高效地进行随机存取(数组的内存连续),但是不擅长插入删除。// end返回一个迭代器指针,指向最后一个元素的后面。
2024-09-29 14:03:21
1558
原创 c++运算符重载
成员函数运算符重载与友元函数运算符重载的最大区别是:友元函数运算符重载的第一个参数,在成员函数中使用this指针代替,即使用成员函数重载的运算符相比友元函数的参数少一个。其他运算符:[]、()、->、,、new、delete、new[]、delete[]赋值运算符:=、+=、-=、*=、/=、%=、&=、|=、^=、<<=、>>=位操作运算符:&、|、~、^(位异或)、<<(左移)、>>(右移)算术运算符:+、-、*、/、%、++、--比较运算符:<、>、>=、<=、==、!
2024-09-28 19:16:26
1499
原创 c++友元 friend
在于提高程序的运行效率,但是,他破坏了类的封装性和隐藏性,使得非成员函数能够访问类的私有成员。例如,类B的某个成员函数称为了类A的友元成员函数,这样类B的该成员函数就可以访问类A的所有成员了。错误:this是B对象不是A对象。类实现了数据的隐藏与封装,类的数据成员一般定义为私有成员,仅能通过类的成员函数才能读写。如果类C是类B的友元类,类B是类A的友元类,类C不一定是类A的友元类。当一个类B成为了另一个类A的友元类时,类B可以访问类A的所有成员。如果类B是类A的友元类,类A不一定是类B的友元类。
2024-09-28 18:46:26
878
原创 猫爱吃秋刀鱼
cout << "鱼的种类: " << f.get_brand() << " 鱼的重量: " << f.get_weight() << endl;cout << "鱼的种类: " << f.get_brand() << " 鱼的重量: " << f.get_weight() << endl;cout << "鱼的种类: " << f.get_brand() << " " << "鱼的剩余重量: " << f.get_weight() << endl;" << endl;cout << "这鱼够大,我爱吃!
2024-09-27 19:49:03
1135
原创 用io跟信号实现售票
/ 收到 SIGTSTP 信号时,向子进程发送 SIGUSR1 信号,并等待子进程退出。// 收到 SIGQUIT 信号时,向父进程发送 SIGUSR2 信号。// 设置信号处理函数。// 收到 SIGINT 信号时,向父进程发送 SIGUSR1 信号。
2024-09-26 17:28:03
699
原创 c++基础部分
C++在C语言的基础上进行了扩充和完善,是一种面向对象程序设计(OOP)语言Stroustrup说:“这个名字象征着源自于C语言变化的自然演进”。C++被视为C语言的上层结构,1983年Rick Mascitti建议使用C++这个名字,就是源于C语言中的“++”操作符(变量自增)。// 连续输入三个数据,分别给abc三个变量。"请输入一行字符串,可以包含空格:"// C++的字符串类型。
2024-09-25 17:24:25
401
原创 基于WebServer的工业数据采集系统
HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于Web Browser(浏览器)到Web Server(服务器)进行数据交互的传输协议。HTTP是。
2024-09-23 18:51:59
3797
原创 Modbus RTU
在一般工业场景使用modbus RTU的场景还是更多一些,modbus RTU基于串行协议进行收发数据,包括RS232/485等工业总线协议。与modbus TCP不同的是RTU没有报文头MBAP字段,保留从机地址,在尾部增加了两个CRC检验字节(CRC16),因为网络协议中自带校验,所以在 ModbusTCP协议中不需要使用CRC校验码。// 打开串口文件( /dev/ttyS1)// 6.串口发送----向串口文件写数据。// 7.串口接收----读取串口文件。// 3.创建要发送的03功能数组。
2024-09-19 18:57:45
1281
原创 modbus
保持寄存器,这个寄存器的单位不再是bit而是两个byte,也就是可以存放具体的数据量的,并且是可读写的。离散输入寄存器,离散输入寄存器就相当于线圈寄存器的只读模式,他也是8个bit表示一个开关量,而他的开关量只能读取输入的开关信号,是不能够写的。输入和保持寄存器是字寄存器(每个寄存器数据占2个字节),工业上主要用于存储工业设备的值。线圈寄存器支持读也支持写,写在功能码里面又分为写单个线圈寄存器和写多个线圈寄存器。一共有四种类型的寄存器,分别是:线圈、离散量输入、输入寄存器、保持寄存器。
2024-09-18 19:56:58
626
原创 网络编程速递小项目
实现账号的注册、登录、注销、修改用户密码功能,当登录成功时可以寄快递、查快递、修改快递信息、取消订单等功能。实现账号的注册、登录、注销、修改用户密码功能,当登录成功时可以查快递、送快递、查看历史订单等功能。//0:表示未完成订单 1:表示已完成订单。//用户类型:1:用户 2:快递员。//用户类型:1:用户 2:快递员。//0:表示未完成订单 1:表示已完成订单。
2024-09-15 18:32:15
3784
原创 udp聊天室
if ((N->next->addr.sin_addr.s_addr == saddr.sin_addr.s_addr) && (N->next->addr.sin_port == saddr.sin_port)) //判断是否存在该客户端数据。//清空输入进来的内容。if (strcmp(data.type, "send_t") == 0) //聊天,跳过用户。
2024-09-12 11:55:32
1864
原创 IO多路复用
select:适用于小规模应用,简单易用但有文件描述符限制。poll:比select更灵活,适用于中等规模应用,但性能瓶颈仍然存在。epoll:最适合大规模、高并发应用,性能优越但在 Linux 上才可用。每有一个客户端连接创建一个进程进行通信创建套接字:使用socket()函数创建一个用于通信的套接字。绑定地址:用bind()函数将套接字绑定到指定的 IP 地址和端口上。监听连接:调用listen()函数,使服务器开始监听客户端的连接请求。接受连接:使用accept()
2024-09-10 15:20:37
1146
原创 创建一个守护进程,循环间隔1s向文件中写入一串字符“hello”
原因:子进程继承了父进程的一些已经打开了的文件,这些被打开的文件可能永远不会被 守护进程访问,但它们一样占用系统资源,而且还可能导致所在的文件系统无法被卸载。子进程继承了父进程的文件权限掩码,给该子进程使用文件带来一定的影响,因此把文件 权限掩码设置为0,可以增强该守护进程的灵活性。4.函数说明:chdir() 将进程当前的工作目录改变成以参数路径所指的目录4.重设文件权限掩码。让子进程成为会话组组长并且脱离终端:为了让子进程完全脱离终端;目的:增大进程创建文件时权限,提高灵活性;5. 关闭文件描述符。
2024-08-28 14:21:19
957
原创 常见的学生管理系统
printf(" * S=按学号查询学生成绩 *\n");void Sort(struct score s[50], int n) // P=按平均成绩由高到低排序。void Search(struct score s[50], int n) // S=按学号查询学生成绩。void Type(struct score s[50], int *n) // T=成绩录入。
2024-08-10 18:30:49
1422
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人