自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Goallegoal的博客

人生有两条路,一条是必须走的,一条是想走的,把必须走的走好,才能走好想走的路。

  • 博客(213)
  • 资源 (2)
  • 收藏
  • 关注

原创 学习计划

个人成长计划决定做一个索引,一是提醒自己接下来要学些什么,二来将所学知识整理入库便于查找随时复习。Kali Linux 渗透测试备注

2020-04-25 22:13:50 136

原创 Qt 基本文件操作

Qt 基本文件操作文件操作是应用程序必不可少的部分。Qt 作为一个通用开发库,提供了跨平台的文件操作能力。在所有的 I/O 设备中,文件 I/O 是最重要的部分之一,因为大多数的程序依旧需要首先访问本地文件。QFile提供了从文件中读取和写入数据的能力。通常会将文件路径作为参数传给QFile的构造函数。不过也可以在创建好对象后使用setFileName()来修改。QFile需要使用 / 作为文件分隔符,会自动将其转换成操作系统所需要的形式,例如 C:/windows 这样的路径在 Windows 平台下

2020-12-01 19:52:42 11

原创 了解 Qt 绘图设备QPixmap、QBitmap、QImage和 QPicture

了解 Qt 绘图设备QPixmap、QBitmap、QImage和 QPicture绘图设备是指继承QPaintDevice的子类,分别是QPixmap、QBitmap、QImage和 QPicture。四个不同的派生类主要功能也不同,其中,QPixmap专门为图像在屏幕上的显示做了优化;QBitmap是QPixmap的一个子类,它的色深限定为1,可以使用 QPixmap的isQBitmap()函数来确定这个QPixmap是不是一个QBitmap;QImage专门为图像的像素级访问做了优化;QPi

2020-12-01 15:33:07 17

原创 重写 QWidget 中的 paintEvent() 处理绘图事件

重写 QWidget 中的 paintEvent() 处理绘图事件Qt的绘图系统允许使用相同的 API在屏幕和其它打印设备上进行绘制。整个绘图系统基于QPainter,QPainterDevice和QPaintEngine三个类。QPainter用来执行绘制的操作;QPaintDevice是一个二维空间的抽象,这个二维空间允许QPainter在其上面进行绘制,也就是QPainter工作的空间;QPaintEngine提供了画笔(QPainter)在不同的设备上进行绘制的统一的接口。QPaintEn

2020-12-01 10:45:56 19

原创 Qt中的事件过滤器

Qt中的事件过滤器在程序到event事件分发器之间,还有一层更为高级的过滤,称为事件过滤器,该部分可以完成从程序分发到event事件之间的一次高级拦截。事件过滤器的使用包含两个步骤:1、给控件安装事件过滤器;2、重写eventfilter事件。// 步骤1,安装事件过滤器ui->label->installEventFilter(this);// 步骤2,重写eventfilter事件bool Widget::eventFilter(QObject *watched, QEve

2020-11-30 21:22:03

原创 Qt中event事件分发器

Qt中event事件分发器运行程序时会根据实际的操作触发不同的多个事件,例如按下鼠标事件,直观讲好像是点击鼠标后,直接会调用mousePressEvent来处理事件,其实不然,在程序与各事件处理函数之间,还有一个专门用来管理事件的部分,称为事件分发bool event(QEvent *ev)。因此,实际事件处理流程是:用户点击鼠标,程序接收到该动作,将其交付给事件分发,事件分发对事件进行判断,然后传递给对应的事件处理函数,完成事件的处理。事件分发的返回值为bool类型,如果返回值为true,则表示用户将

2020-11-30 21:03:33 9

原创 Qt实现定时器的两种方法

Qt实现定时器的两种方法第一种,重写QTimer类中的timerEvent()方法#include "widget.h"#include "ui_widget.h"Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget){ ui->setupUi(this); id1 = startTimer(1000); id2 = startTimer(2000);}Wi

2020-11-30 19:50:58 8

原创 Qt设置鼠标追踪setMouseTracking()

Qt设置鼠标追踪setMouseTracking()void setMouseTracking(bool enable)参数可以为true或者false,若将参数置为false,意味着关闭鼠标追踪,此时只有当至少一个鼠标按键按下时才能捕获到鼠标移动事件。而将参数置为true时,即使没有按下鼠标键,移动鼠标时也可以捕获鼠标的移动事件。...

2020-11-30 15:48:35 6

原创 Qt鼠标事件中的button()和buttons()

Qt鼠标事件中的button()和buttons()QEvent类是所有事件类的基类,Qt的主事件回路从事件队列获取本地窗口系统事件,将其转换为QEvent,然后再传递给QObjects。创建鼠标事件,MyLabel继承自QLabel,声明如下:#ifndef MYLABEL_H#define MYLABEL_H#include <QWidget>#include <QLabel>class MyLabel : public QLabel{ Q_OBJECT

2020-11-30 15:37:46

原创 Qt自定义控件及设计控件功能

Qt自定义控件及设计控件功能Qt Creator中自带多种常用的控件,使用者可以在设计模式下进行页面布局,拖拽生成想要使用的控件,并在编辑模式下对控件的功能实现进行控制。这些开发环境自带的控件虽然种类多但功能单一,每一种控件只能完成特定的功能。为了满足开发需要,就需要将其中的几种控件进行组合,来完成单一控件无法实现的任务。下面介绍如何在Qt Creator中封装自定义控件。在封装自定义控件前,先要new一个用来放置控件的ui,这样既可以继续使用设计模式,又不妨碍其他控件。右键点击项目,添加Qt设计师界面

2020-11-26 17:01:16 10

原创 Qt Creator中的Item Widgets部署及使用-QListWidget、QTreeWidget、QTableWidget控件

Qt Creator中的Item Widgets部署及使用-QListWidget、QTreeWidget、QTableWidget控件1、QListWidget控件在设计模式中,拖拽Item Widgets中的List Widget生成一个空的列表。然后回到编辑模式进行部署: // #include <QListWidget> // 基于item,每行都代表一个单独的QListWidgetItem项,先创建一行 QListWidgetItem *item = new

2020-11-26 15:22:19 9

原创 Qt常用对话框及用法总结

Qt常用对话框及用法总结1、QMessageBox模态消息对话框QMessageBox包含上述四种消息对话框,分别为问题、信息、警告、错误提示,对外API分别为:QMessageBox::StandardButton critical(QWidget *parent, const QString &title, const QString &text, QMessageBox::StandardButtons buttons = Ok, QMessageBox::StandardB

2020-11-26 11:17:01 9

原创 Qt创建模态和非模态对话框

Qt创建模态和非模态对话框在使用软件时,会遇到各式各样的对话框,弹出的对话框大致可以分为两大类,模态对话框和非模态对话框,怎么对这两种对话框进行区分呢?简单来说,对于模态对话框,在未关闭之前,无法再对同一软件的其他窗口进行操作,即强制性用户交互;而非模态对话框与之相反,未关闭之前,依然可以操作同软件下的其他窗口,即非强制性用户交互。Qt中根据功能需求,可以分别对这两类对话框进行设置与构建。首先来看模态对话框,强制交互的模态对话框一经打开,程序的运行会进入阻塞状态,直至对话框关闭或触发其他动作。其简单部

2020-11-25 15:19:35 7

原创 QMainWindow添加资源文件

QMainWindow添加资源文件之前已经通过纯代码的方式添加了QMainWindow的菜单栏、状态栏、铆接部件及中心部件,现在使用Qt的设计模式直接添加菜单栏。菜单栏添加完成,再回到编辑模式,通过代码向 “文件-新建” 前面添加一个图标: // 通过ui可以找到所有的已添加控件 // 使用绝对路径的方式 ui->actionnew->setIcon(QIcon(/*图片路径*/));开发环境更换可能会导致绝对路径不可用,下面介绍向qt中添加资源文件:1、首先

2020-11-25 11:45:42 4

原创 QMainWindow菜单栏、工具栏、铆接部件及中心部件的添加和使用

QMainWindow菜单栏、工具栏、铆接部件及中心部件的添加和使用QMainWindow是一个用户提供主窗口程序的类,包含一个菜单栏、多个工具栏、多个铆接部件、一个状态栏及一个中心部件,是许多应用程序的基础,如文本编辑器、图片编辑器等。菜单栏菜单栏最多只能有一个,下面演示菜单栏的简单创建,包含头文件#include <QMenuBar> // 创建菜单栏 QMenuBar *bar = menuBar(); // 将菜单栏放入窗口中 setMenuBar

2020-11-25 10:21:53 7

原创 Qt使用lambda表达式实现无参信号与有参槽的连接

Qt使用lambda表达式实现信号与槽连接C++11中的Lambda表达式用于定义并创建匿名的对象,以简化编程工作,Lambda表达式的基本结构为:[函数对象参数](操作符重载函数参数)mutable->返回值{函数体}。其中函数对象参数,[]表示一个lambda表达式的开始,这部分必须存在,不能省略。函数对象参数是传递给编译器自动生的函数对象类的构造函数的。函数对象参数只能使用那些到定义lambda为止时lambda所在作用范围内可见的局部变量,包括所在类的this,函数对象参数有以下几种形式

2020-11-24 15:32:11 8

原创 Qt编程中的信号和槽机制

Qt编程中的信号和槽机制在使用自定义类创建一个按钮之后,只能看到一个按钮的图形,但是使用鼠标点击并无任何反应,下面想要实现一个“点击按钮可以关闭窗口”的功能。关闭窗口的功能可以被抽象为以下对象和操作,即:按钮,点击按钮,窗口,关闭窗口。在qt中使用connect实现这个过程。connet(信号的发送者,发送的具体信号,信号的接受者,信号的处理(槽))信号槽的一个优点:松散耦合,即信号的发送端和接收端本身是没有关联的,通过connect连接,将两端耦合在一起。// myself buttonMyP

2020-11-24 11:03:30 15

原创 Qt理解对象模型-对象树

Qt理解对象模型-对象树在Qt中创建对象的时候会提供一个Parent指针,QObject是以对象树的形式组织起来的,当创建一个QObject对象时,会看到QObject的构造函数接收一个QObject指针作为参数,这个参数就是parent,也就是父对象指针。这相当于,在创建QObject对象时,可以提供一个其父对象,此时创建的QObject会自动添加到其父对象的children列表中。(注意,这里的父对象并不是继承意义上的父类)当父对象析构的时候,这个列表中的所有对象都将会被析构。这种机制在GUI程序设

2020-11-23 16:34:04 15

原创 Qt Creator中按钮控件常用API

Qt Creator中按钮控件常用API使用QPushButton创建按钮引入头文件#include <QPushButton>后,使用QPushButton *btn = new QPushButton;使用btn->show();的方式对按钮进行显示,则会以顶层方式弹出窗口控件;如果想让btn对象依赖在myWidget窗口中,则需要在父类的构造函数中使用btn->setParent(this);。在按钮上显示文本btn->setText("button");在创

2020-11-23 16:33:24 15

原创 广义表与二叉树之间的相互转换

广义表与二叉树之间的相互转换二叉树是树形结构中一种特殊的树,其特点是每个结点最多只有两个孩子结点。二叉树除了可以通过典型的树状图来表示外,还可以使用广义表进行表示,例如:A(B,C)表示根结点A的左孩子结点为B,右孩子结点为C;A(,C)表示根结点A的左子树为空,右孩子结点为C。依此类推,可以将任何一棵二叉树以广义表的形式表示出来。广义表转化为二叉树广义表转化成二叉树可以借助栈来实现,利用栈先进后出的特点,先将根结点压入栈中,如果左孩子结点不为空,则将其作为栈顶结点的左孩子结点,并压入栈中,递归左子树

2020-11-17 17:17:05 144

原创 2020-10-24

1024

2020-10-24 08:48:40 6

原创 2020-10-24

1024

2020-10-24 08:41:38 8

原创 判断字符是否是同一个字母的大小写

判断字符是否是同一个字母的大小写方案1、由ASCII码表知,同一个字母的小写表示ASCII码值要比大写表示的大32char ch1 = 'a';char ch2 = 'A';if( ch1 == ch2 + 32 ) ;方案2、tolower将字符转换为小写if( tolower(ch1) == tolower(ch2) ) ;方案3、使用异或,通过观察大小写字母的ASCII码值发现,同一个字母的大写和小写之间相差32,用二进制表示时,差异仅体现在从右往左数的第6位上,所以可以通过判断

2020-10-10 10:35:28 44

原创 atoi()函数的使用

atoi()函数的使用atoi()用于将字符串转换为整型值,其函数原型为int atoi(const char *nptr);,该函数在转换字符串时,会忽略空字符并在遇到非数字字符时停止转换,若无法转换则返回0。使用该函数需要包含头文件#include <cstdlib>string str("777as");int num = atoi(str.c_str());cout << num << endl; ...

2020-10-09 19:31:03 13

原创 C++ string类成员函数c_str()的用法

C++ string类成员函数c_str()的用法c_str()生成一个const char*指针,指向以空字符终止的数组,该指针不需要手动释放和删除。在使用c_str()时要注意,c_str()指向的数组是一个临时数组,其中的数据会因为程序的某些操作而失效,例如:string str("hello!");const char *pstr = str.c_str();cout << pstr << endl; // hello!str = "world";cout &

2020-10-09 19:09:21 23

原创 C++string类常用方法

C++string类常用方法1、string(const char *s) :将 string 对象初始化为 s 指向的字符串string str("hello");2、string(size_type n,char c) :创建一个包含 n 个元素的 string 对象,其中每个元素都被初始化为字符 cstring str(10, 'a');3、string(const string &str) :将一个 string 对象初始化为 string 对象 str(复制构造函数)str

2020-10-09 15:34:26 24

原创 函数递归

函数递归程序调用自身的编程技巧称为递归。递归做为一种算法,在程序设计语言中广泛应用。一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的主要思考方式在于:大事化小。递归的两个必要条件:1、存在限制条件,当满足这个限制条件时,递归便不再继续。2、每次递归调用之后,越来越接近这个限制条件。练习1:接收一个无符号整型值,按顺

2020-08-06 21:34:13 37

原创 C语言字符和字符串库函数的使用、注意事项及模拟实现

C语言中没有字符串类型,字符串通常会被放到常量字符串或者字符数组中,在程序的开发过程中要经常对字符和字符串进行处理,这就需要引入一些库函数来简化字符、字符串的处理操作,提高程序的开发效率。

2020-08-06 17:20:21 54

原创 C语言strstr()函数模拟实现和库实现之间的差距

C语言strstr()函数模拟实现和库实现之间的差距strstr()的函数原型为char *strstr(const char *haystack, const char *needle),用于在字符串 haystack 中查找第一次出现字符串 needle 的位置,注意不包含终止符 ‘\0’。该函数的返回值为在 haystack 中第一次出现 needle 字符串的位置,如果未找到则返回 null。下面先贴上自己模拟实现的myStrstr(),先不看代码中的细节处理,仅关注代码逻辑。在代码编写的过程中

2020-08-06 10:25:37 46

原创 C语言错误处理-输出错误信息

C语言错误处理-输出错误信息程序开发过程中,不可避免地会因为细节疏忽导致程序的编译、运行出错,当出现错误时编译器一般会将错误信息展示出来,但由程序操作或用户输入导致的错误往往会使程序直接崩溃并无任何的提示,此时,就需要一种方法能够用在程序可能出错的地方,当错误发生时可以提前将错误信息输出并中止运行,避免程序的崩溃、简化程序bug的查找。下面介绍C语言中几种用来主动输出错误信息的方法。stderr首先介绍stderr标准错误,在程序创建的同时会开启三个默认的流,分别为标准输入stdin、标准输出stdo

2020-08-05 10:09:56 186

原创 C语言柔性数组使用方法、特点及优点

C语言柔性数组使用方法、特点及优点在C99标准中定义有,结构体中的最后一个元素允许是未知大小的数组,这个数组就叫做柔性数组,所以说柔性数组其实是结构体中的一个数组,“柔性” 指的是该数组的大小可大可小。例如:struct S{ int i; int a[];//柔性数组成员,该数组为柔性数组};上面的定义是没有问题的,如果使用的编译器在运行上述代码时报错无法编译,可以像如下方式定义:struct S{ int i; int a[0];//将数组的大小设为0};上述柔性数组的声明

2020-08-04 08:49:14 70

原创 Linux环境下使用fcntl实现C语言非阻塞输入

Linux环境下使用fcntl实现C语言非阻塞输入在使用C语言编程时,常常会用到scanf()、getchar()等函数来获取键盘的输入,当键盘没有输入时程序会发生阻塞并一直保持在阻塞状态,此时如果想要继续执行下一步的程序,就需要将IO状态置为非阻塞,以确保无用户输入的情况下程序的正常执行。fcntl是Linux中的函数,用来改变已打开文件的性质,其定义为int fcntl(int fd, int cmd);,其中参数fd表示欲设置的文件描述符,参数cmd代表将要执行的操作,如果该操作需要键入参数,fc

2020-08-02 17:54:48 140

原创 Linux环境下静态库和动态库(共享库)的创建及使用

Linux环境下静态库和动态库(共享库)的创建及使用编写程序时,常常将重复代码写进函数,通过多次调用函数来减少工作量,类似的,当一个工作需要多次调用某些函数和变量时,可以将这些函数、变量封装成库,供其他程序调用,提高开发效率。C语言中有两种库类型,分别为静态库和动态库(共享库)。静态库静态库是在目标文件链接成可执行文件过程中,直接将代码载入可执行文件,后期程序的运行不再需要静态库。在Linux系统中,静态库的后缀为.a,静态库的生成分为两步,第一步将源文件编译生成目标文件,第二步通过目标文件生成静态库

2020-08-02 16:37:12 71

原创 打卡机核心功能实现(C语言)

222222222应市场需求,某工程师现设计了一款新上下班打卡机,打卡机具有以下功能:(1)上班打卡,员工具有编号(首位为 1 的六位编号),输入编号后,再输入校验码,校验码生成规则:员工编号除首位反序,再与员工编号求和,如:员工编号,110086,校验码为 178087。校验码错误即打卡失败。记录打卡时间 。(2)下班打卡,只需输入员工编号即可。记录打卡时间,显示该人员今天上班时长,如果上班时长不够,显示早退 xx 分钟。可以更新下班打卡时间。无下班打卡显示缺卡。(3)可以设置规定上班时长,如 9

2020-08-01 22:32:28 614

原创 C语言整型转字符串

C语言整型转字符串顺序存储顺序打印#include <stdio.h>int main(){ int num = 110086; char str[6] = {0}; int divnum = 100000; int i = 0; for(i=0; i<6; i++) { str[i] = (num / divnum)+48; num = num % divnum; divnum =

2020-08-01 21:44:05 71

原创 C语言自定义类型

C语言自定义类型结构体结构体类型的声明结构是一些值的集合,这些值称为成员变量,结构的每个成员可以是不同类型的变量。struct tag{ member-list;}variable-list;struct tag x;也可以通过typedef对类型重命名typedef struct Student{ char name[20]; int age; char sex[6];} Student;// 这里的Student不是变量名,而是类型名Student x;对结构

2020-08-01 09:15:42 39

原创 动态内存管理

动态内存管理为什么存在动态内存开辟常规的开辟内存空间的方式,例如声明变量、数组等,有以下2个特点:1、空间开辟的大小是固定的;2、数组在声明的时候,必须指定数组的长度,所需要的内存在编译时分配。如果想要在程序运行过程中根据实际内存使用情况动态的开辟内存空间,以上方法就做不到了,只能尝试动态内存管理。动态内存函数malloc()malloc函数包含在stdlib.h头文件中,原型为void* malloc(size_t size);这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针

2020-08-01 09:15:08 46

原创 C语言数组和指针笔试题小结

11111111111一维数组 int a[] = {1,2,3,4}; printf("%d\n", sizeof(a)); // 16,sizeof(数组名),当数组名单独放在sizeof()中时,数组名表示整个数组 printf("%d\n", sizeof(a+0)); // 8,数组名没有单独存放时表示首元素地址 printf("%d\n", sizeof(*a)); // 4 printf("%d\n", sizeof(a+1)); // 8 printf("%d\n",

2020-07-30 08:09:29 82

原创 C语言指针从入门到进阶

111指针定义在计算机科学中,指针是编程语言中的一个对象,利用地址,它的值直接指向存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”(指针是一个变量,用来存放地址)。意思是通过它能找到以它为地址的内存单元(内存空间编址是以一个字节为一个地址)。int a = 10; // 变量a占用了4个地址空间int *p = &a; //取a的地址,是拿到4个地址空间的起始位置地址// 将此地址存放到 p 中,此时p就是指针

2020-07-27 19:06:12 28

原创 C语言文件操作

文件操作文件基础一般情况下,将文件分为文本文件和二进制文件两种。文本文件:以ASCII码编写的可视化的字符型文件,不同的文字以特殊编码存在,如GBK、utf-8等。二进制文件:直接以原生二进制码存放的文件,如BMP等图片文件,MP3等音频文件,exe等可执行文件。数据流:一组有序、有起点和终点的字节的数据序列,程序和数据的交互是以流的形式进行的。标准 IO 及缓存基础文件操作C语言获取的文件,其使用 FILE 结构体进行定义。在命令行上显示一段内容printf("hello!\n");

2020-07-24 08:26:31 29

VRRP实现网关冗余.rar

虚拟路由冗余协议(Virtual Router Redundancy Protocol,简称VRRP)是由IETF提出的解决局域网中配置静态网关出现单点失效现象的路由协议,1998年已推出正式的RFC2338协议标准。VRRP广泛应用在边缘网络中,它的设计目标是支持特定情况下IP数据流量失败转移不会引起混乱,允许主机使用单路由器,以及即使在实际第一跳路由器使用失败的情形下仍能够维护路由器间的连通性。

2020-04-03

BGP综合实验.rar

通过BGP基本部署实现不同 AS 之间的网络通信。 根据网络拓扑进行IP地址规划,实现底层联通,并进行AS设计,运行BGP协议,实现AS之间的互联,并通告路由。

2020-03-28

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人 TA的粉丝

提示
确定要删除当前文章?
取消 删除