- 博客(47)
- 收藏
- 关注
原创 关于qt当点击标题栏进行窗体移动和调用文件对话窗体时,对串口通信的影响
串口可以正常的发送信心但是无法接收通过串口反馈的信息解决思路通过自定义标题栏解决当窗体移动时串口无法接收到数据的情况
2021-05-27 16:21:54
650
8
原创 关于重载鼠标事件注意事项
在重载鼠标事件时,凡是对父窗体成员变量进行操作时,都会引起程序崩溃(解决办法,运用信号与槽的方法,间接调用,禁止直接调用)
2021-05-21 11:36:47
161
原创 QPainterEvent 调用时机
当发生一下情况时会产生绘制事件并调用paintEvent()函数:1.在窗口部件第一次显示时,系统会自动产生一个绘图事件,从而强制绘制这个窗口部件。2.当重新调整窗口部件的大小时,系统也会产生多个绘制事件。3.当窗口部件被其他窗口部件遮挡,然后又再次显示出来的时候,就会对那些隐藏的区域产生一个绘制事件。4. 当该窗体失去焦或者得到焦点时,系统会自动产生一个绘图时间同时可以调用QWidget::update()或者QWidget::repaint()来强制产生一个绘制事件。二者的区别是:repai
2021-03-12 09:28:32
1793
原创 QTextStream 写入文件中文乱码问题
QTextStream out(&file);out.setCodec(QTextCodec::codecForName("utf-8"));
2021-02-19 09:49:32
941
原创 常见图片格式
QString filePath = QFileDialog::getOpenFileName(this, "选择图片", ".", "JPEG(*.jpg *.jpeg);;"
2021-02-03 09:57:20
74
原创 点击右键弹出下拉框
在用QT编程时,有时候要实现鼠标右键弹出菜单的功能.下面代码演示鼠标右键弹出菜单.1.新建一个QT工程,点击MainWindow.ui,鼠标右键Go to slot…,添加customContextMenuRequested(const QPoint &pos)事件2.找到属性页中的contextMenuPolicy,把DefaultContextMenu改成CustomContextMenu.保存关闭MainWindow.ui3.在on_MainWindow_customContextMen
2021-01-28 14:50:29
317
原创 [QString] QString 中那些与字符串解析相关的函数
QString 提供了很多与字符串相关的函数来简化字符串的解析,不使用这些函数当然也可以解析字符串,这些函数只是简化字符串解析时的代码:DecodeTokenDecodeToken 按指定的分隔符来解析出第一个字符串,分隔符可以有多种。SplitTokenSplitToken 按指定的分隔符分解所有的字符串内容,并将分解的结果加到一个 TStrings 的实例中。StrBeforeStrBefore 函数用于解析在指定的子字符串出现之前的字符串。SplitByStrSplitByStr 函数
2020-12-11 09:33:22
390
转载 在重载运算符时,类的对象可以直接访问私有成员
以前对这里确实有点疑惑,但是最近在看其他书的时候突然看到这么一句话:实践证明,类(class)私有成员可以被类成员函数访问,不区分成员在哪个实例(instance)里。也就是说,在类内部的成员函数中,哪怕是传入的对象,也是可以直接访问该对象的私有成员。(前提是该对象必须是本类型的一个对象)这样类对象可以直接访问私有成员就合情合理了,而且这么做也确实是方便的。...
2020-10-11 20:26:49
1282
原创 关于输入流状态函数cin.eof()的问题
问题:关于输入流状态函数cin.eof()的问题int main(){char gc;while(!cin.eof()) //直至按ctrl+z键退出!{cin>>gc;cout<<gc<<endl;}cout<<cin.eof()<<endl<<cin.fail()<<endl<<cin.bad()<<endl;}《c++ primer》上说的是遇到文件结束符 cin.eof返
2020-10-10 22:28:38
1440
原创 c++类基础之构造函数与析构函数详解
“生而不同”之构造函数构造函数的作用在创建一个新的对象时,自动调用的函数,用来进行“初始化”工作:对这个对象内部的数据成员进行初始化。构造函数的特点1)自动调用(在创建新对象时,自动调用)2)构造函数的函数名,和类名相同3)构造函数没有返回类型4)可以有多个构造函数(即函数重载形式)构造函数的种类默认构造函数自定义的构造函数拷贝构造函数赋值构造函数默认构造函数没有参数的构造函数,称为默认构造函数。1.合成的默认构造函数构造函数的函数名,和类名必须相同但没有手动定义默认构造
2020-10-05 23:07:53
162
原创 堆空间分配常见的错误,以及vc内存泄露检测工具
申请的内存多次释放内存泄漏释放的内存不是申请时的地址释放空指针释放一个内存块,但继续引用其中的内容越界访问内存泄漏检测工具VisualC++ debugger 和 CRT 库第一步:包含以下头文件#define _CRTDBG_MAP_ALLOC#include <stdlib.h>#include <crtdbg.h>第二步:接管 new 操作符#ifdef _DEBUG#ifndef DBG_NEW#define DBG_NEW new ( _.
2020-10-04 22:49:03
121
原创 变量的 4 种存储类型
存储类型:总共有四种存储类型的变量,分别为自动变量(auto)、静态变量(static)、外部变量(extern)以及寄存器变量(register)。auto - 函数中所有的非静态局部变量。(c语言可以指定类型如auto int a,c++编译器不能指定类型编译器会进行推导)register - 一般经常被使用的的变量(如某一变量需要计算几千次)可以设 置成寄存器变量,register 变量会被存储在寄存器中,计算速度远快于存在内存 中的非 register变量.(现在已经不需要定义了,编译器会进行
2020-10-04 22:44:54
4401
原创 指针详解
指针实际就是保存内存地址的一个变量,指针是有类型的,当对指针进行解引时,会根据指针的类型对所指的内存进行相应的解析,同变量一样也占用一定的内存(32位系统下占4位字节,64位占8位字节)指针的定义int a;int* p = &a;*代表 p为int类型的指针,&为取地址符int* p, s1;在这行代码中p为int类型的指针,s1为整形变量指针的三种const用法const int* p;// int const* p; p = &a; //这两种定义方法
2020-10-04 21:53:56
837
原创 .c++内存分布详解
c++内存分区大致分为代码区,常量区,全局数据区,堆区,栈区(也可以进行进一步分区,小编感觉没必要了解太多就不做进一步扩展了)1、栈区(stack)(空间大小一般为2mb):由编译器自动分配释放,存放函数的参数值,局部变量值等。int print_int_string(int s1, std::string s2) { //s1与s2形参就是局部变量 //int a; double b; 该函数里面定义的变量也是局部变量 printf("int : %d, string : %s", s1,
2020-10-03 23:19:59
262
转载 断言(assert)的用法
我一直以为 assert 仅仅是个报错函数,事实上,它居然是个宏,并且作用并非"报错"。在经过对其进行一定了解之后,对其作用及用法有了一定的了解,assert() 的用法像是一种"契约式编程",在我的理解中,其表达的意思就是,程序在我的假设条件下,能够正常良好的运作,其实就相当于一个 if 语句:if(假设成立){ 程序正常运行;}else{ 报错&&终止程序!(避免由程序运行引起更大的错误) }但是这样写的话,就会有无数个 if 语句,甚至会出现,
2020-10-01 22:56:29
6906
原创 为什么要使用指针
1.函数的值传递,无法通过调用函数,来修改函数的实参2.被调用函数需要提供更多的"返回值"给调用函数3.减少值传递带来的额外开销,提高代码执行效率(效率提高好多倍)
2020-10-01 22:27:58
250
原创 MySQL(5.0版本以上) varchar和char能存储几个中文字符
char (n): 固定长度字符串,n 表示要存储的最大字符数(不是字节),范围( 0 ~ 255 )varchar (n):可变长度字符串,长度可以指定为0到65535之间的值(实际上由于字符数大于255后保存字符长度需要2个字节,所以长度最大可为65533字节)。 VARCHAR的有效最大长度取决于最大行大小(65535字节,在所有列之间共享)和所使用的字符集。一个汉字占多少长度与编码有关:UTF-8:一个汉字 = 3个字节,英文是一个字节GBK: 一个汉字 = 2个字节,英文是一个字节ut
2020-09-30 10:05:44
4021
原创 gets_s
char *gets_s(char *buffer,size_t sizeInCharacters);其中第二参数就是允许的输入长度bai, 这里的size应该分配为dubuffer-1的长度,因为函数自动为’\0’分配空间的时候会溢出。和gets的区别就是gets读入不限制输入长度,所以在2011年12月,ANSI 采纳了 ISO/IEC 9899:2011 标准,标准中删除了 gets()函数,使用一个新的更安全的函数gets_s()替代,注意输入的字符串大小一定要不能大于sizeInCharact
2020-09-29 16:40:45
446
原创 vs2015中使用的scanf函数报错,如何正确使用新的API编写程序
vs很多带“_s”后缀的函数是为了让原版函数更安全,传入一个和参数有关的大小值,避免引用到不存在的元素,有时黑客可以利用原版的不安全性黑掉系统。比如:char d[20];写成scanf_s("%s",d,20);才是正确的,有这个参数20使准确性提高。ANSI C中没有scanf_s(),只有scanf(),scanf()在读取时不检查边界,所以可能会造成内存访问越界,例如分配了5字节的空间但是读入了10字节char buf[5]={’\0’};scanf("%s", buf);如果输入12345
2020-09-29 14:51:22
150
原创 c和c++字符串比较的区别
**c++**可以直接使用比较运算>, <, ==, >=, <=(这里不解释字符串的比较规则,如果需要了解请自行查找资料),字符串比较的结果为bool类型**c语言字符串比较需要使用函数int strcmp(const char str1,const char str2);str1 < str2时, 返回值<0(有些编译器返回-1有些编译器返回差值(第一个不相同的字符ASCII码的差值,str1中的字符减去str2中的字符))str1 > str2时,
2020-09-28 19:43:52
355
原创 c与c++遇见文件结束符的不同处理
c语音当c语言遇见文件结束符时(在windows平台ctr+z),scanf()函数返回的值为-1c++语言当c++语言遇见文件结束符时(在windows平台ctr+z),[cin>>数据类型]函数返回的值为0
2020-09-28 17:50:33
205
原创 c与c++如何获取字符串长度
c语言size_t strlen(const char *string);其中size_t实际上是unsigned int,在VC6.0或Dev-C++中可以看到这样的代码:typedef unsigned int size_t;头文件:string.h或cstring功能:计算给定字符串的(unsigned int型)长度,不包括’\0’在内说明:返回s的长度,不包括结束符NULL。strlen(char函数求的是字符串的实际长度,它求得方法是从开始到遇到第一个’\0’,如果你只定义没有给它赋
2020-09-28 17:45:28
1287
原创 c/c++常见的清空输入缓存区用法
c++ 清空缓存区经常用的函数#include std::cin.fail() : 该函数返回值bool类型,当输入的数据类型不匹配时,该函数返回值为false此时无法从输入缓存区取值.std::cin.clear() : 该函数的作用为清除错误标志,表示std::cin>>(数据类型)可以继续从输入缓存区读取数据std::sync() : 清空输入缓存c清空缓存区经常用的函数fflush() : 清空输入缓存...
2020-09-27 21:56:06
2378
原创 c++如何控制输出精度
cout.precision(num); 该函数用来设置精度,num为其精度的值,度默认精度带小数点前的整数部分cout.flags(cout.fixed);定点法:设置精度为其小数点后的位数cout.unsetf(cout.fixed); 取消定点法
2020-09-27 17:54:53
1288
原创 C++中cin.get和cin.getline以及getline的区别 以及c语音gets()详解
分为三bai种情况来看:1)输入的字符串不du超过限定大小get(str,Size):读取所有字符,遇到’\n’时止,并zhi且将’\n’留在输入缓冲区中,其将被dao下一个读取输入的操作捕获,影响该输入处理;getline(str,Size):读取所有字符,遇到’\n’时止,并且将’\n’直接从输入缓冲区中删除掉,不会影响下面的输入处理。2)输入的字符数超出限定的大小get(str,Size):读取Size-1个字符,并将str[Size-1]置为’\0’,然后将剩余字符(包括’\n’)留在输入
2020-09-27 17:31:39
673
原创 列的类型定义
1.整数类型整数类型是数据库中最基本的数据类型。标准SQL中支持INTEGER和SMALLINT这两种数据类型。MySQL数据库除了支持这两种类型以外,还扩展支持了TINYINT、MEDIUMINT和BIGINT。下表从不同整数类型的字节数、取值范围等方面进行对比。mysql> use school; #选择数据库schoolmysql> create table class5(class_id int , class_name varchar(128), class_teacher
2020-06-11 18:41:33
565
1
原创 数据库表的操作
在MySQL数据库中,表是一种很重要的数据库对象,是组成数据库的基本元素,由若干个字段组成,主要用来实现存储数据记录。表的操作包含创建表、查询表、修改表和删除表,这些操作是数据库对象的表管理中最基本也是最重要的操作。1.从最简单的表操作开始创建班级表:ID 名称 班主任101 六年级一班 马老师102 六年级二班 潘老师mysql> create database school; #创建数据库schoolmysql> use school; #选择数据库schoolmy
2020-06-11 18:28:27
334
原创 数据库的操作
像文件一样,我们可以随时对数据库执行如下操作:① 创建数据库② 查看数据库③ 选择数据库④ 删除数据库1.创建数据库创建数据库是指在数据库系统中划分一块空间,用来存储相应的数据,这是进行表操作的基础,也是进行数据库管理的基础。(1)在MySQL中,创建数据库之前,可以使用SHOW语句来显示当前已经存在的数据库,具体SQL语句如下:SHOW DATABASES;(2)创建数据库的SQL语句如下:CREATE DATABASE database_name;(其中参数database_nam
2020-06-11 17:49:48
339
原创 关系模型
关系数据库是建立在关系模型上的。而关系模型本质上就是若干个存储数据的二维表,可以把它们看作很多Excel表。表的每一行称为记录(Record),记录是一个逻辑意义上的数据。表的每一列称为字段(Column),同一个表的每一行记录都拥有相同的若干字段。字段定义了数据类型(整型、浮点型、字符串、日期等),以及是否允许为NULL。注意NULL表示字段数据不存在。一个整型字段如果为NULL不表示它的值为0,同样的,一个字符串型字段为NULL也不表示它的值为空串’’。通常情况下,字段应该避免允许为NU
2020-06-11 17:40:47
276
原创 mysql的安装
免费下载网址:https://dev.mysql.com/downloads/windows/installer/8.0.html版本选择 :社区版8.0.12启动MySQL 服务图形化界面启动右击“计算机”,在快捷菜单中选择“管理”命令,如图1-25所示,打开“计算机管理”对话框。也可以执行“开始”|“控制面板”|“管理工具”|“服务”来启动服务。命令行启动查看服务命令: net start关闭服务命令: net stop MySQL80启动服务命令: net sta
2020-06-11 17:10:58
86
原创 为什么要学习数据库,数据库有什么作用呢,以及为什么要选mysql
1.为什么要使用数据库程序员Jack还是在在校学习期间,就听高年级的大哥忠告,“小伙子,搞编程,想要成为最牛逼的程序员,一定要学好C/C++语言和数据结构及算法”,Jack谨记了这句忠告,因为这位高年级的哥们还没毕业就已经被BAT公司预定,在学校那是风光无限,得到了很多高年级美女学姐的青睐。经过一段时间的刻苦学习,Jack终于把C++ 和数据结构还有算法学得有点模样了,不自觉就进入初级装逼模式,在同学面前那是指手画脚,趾高气昂。。。。这种状态一直持续到实习期间,Jack 进入一家小有名气的游戏开发公司
2020-06-11 16:20:30
13753
3
原创 c++的左值与右值概念详解
了解计算机存储结构cpu: 是大脑执行二进制指令 cpu中含有寄存器,该寄存器没有地址,用于临时保存计算的数据,一般情况下32位有8个寄存器,64位有16个寄存器,寄存器的特点访问速度非常快,容量非常小PAM :访问速度快,容量一般,一但掉电数据就没了磁盘 :访问速度慢容量巨大,永久性保存数据,同时是访I/O的短板左值和右值的概念按字面意思,通俗地说。以赋值符号 = 为界,= 左边的就是左值(lvalue),= 右边就是右值(rvalue)。int a = 666;左值
2020-06-10 18:45:58
283
原创 c++智能指针(观看者需要有c++面向对象的基础,对指针有一定的了解)
1.为什么要使用智能指针先看下面一个例子#include <iostream>#include <string>#include <exception>using namespace std;void memory_leak_demo1() { string* str = new string("今天又敲了一天代码,太累了,回家休息了!!!"); cout << *str << endl; return
2020-06-10 17:37:28
141
原创 文件操作类的实现
1.头文件#ifndef QINIU_LARGE_FILE_OP_H_#define QINIU_LARGE_FILE_OP_H_#include "common.h"namespace qiniu{ namespace largefile { class FileOperation { public: FileOperation(const std::string &file_name,const int open_flags = O_RDWR|O_LARGEF
2020-05-19 21:15:58
194
原创 文件操作常用命令
1.2.1.显示当前目录 pwd 和改变目录 cdpwd 命令作用: 显示当前目录,即工作目录用法: pwdcd命令作用: 改变目录位置用法: cd . . .[OPTION] . . .[FILE]. . . cd 目录路径 - 进入指定的目录中去cd … - 返回父目录cd / - 进入根目录cd 或 cd ~ - 进入用户主目录cd ./* - 进入当前目录下*表示的子目录1.2.2.ls 命令用
2020-05-18 17:49:10
437
原创 海量存储为什么用大文件存储
海量存储为什么用大文件存储大规模的小文件存取,磁头需要频繁的寻道和换道,因此在读取上容易带来 较长的延时。频繁的新增删除操作导致磁盘碎片,降低磁盘利用率和IO读写效率Inode 占用大量磁盘空间,降低了缓存的效果。...
2020-05-18 17:34:10
379
原创 文件内存映射的代码实现
该代码不做具体解读,不懂得的地方可以产考相应的文献(代码注释小编看来已经很详细了)1.头文件#ifndef QINIU_LARGEFILE_MMAPFILE_H_#define QINIU_LARGEFILE_MMAPFILE_H_#include <unistd.h> //包含很多的常规函数,做为一种常见的标准库存在#include "common.h"namespace qiniu{ namespace largefile { struct MMapOption
2020-05-18 17:23:00
496
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人