自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(153)
  • 收藏
  • 关注

原创 IO引脚复用和映射

STM32F4 有很多的内置外设,这些外设的外部引脚都是与 GPIO 复用的。也就是说,一个 GPIO如果可以复用为内置外设的功能引脚,那么当这个 GPIO 作为内置外设使用的时候,就叫做复用。在芯片数据手册或STM32F4XX参考手册中都可以查到哪些引脚可以复用为哪些内置外设。

2024-04-14 17:25:06 683

原创 SysTick滴答定时器 - 延时函数

在Cortex M3权威指南中有详细的讲解:对于STM32,外部时钟源是 HCLK(AHB总线时钟)的1/8 内核时钟是 HCLK时钟 配置函数:SysTick_CLKSourceConfig();

2024-04-08 21:45:01 513

原创 GPIO(STM32)点亮LED灯、按键KEY

GPIO(general porpose intputoutput):通用输入输出端口的简称。可以通过软件控制其输出和输入。stm32芯片的GPIO引脚与外部设备连接起来,从而实现与外部通信,控制以及数据采集的功能。在STM32F4xx芯片上的GPIO口被分成各个组,一共有7组IO口,以A、B、C、D、E、F、G等命名(不同的stm32芯片,引脚数不同,可能只有其中几组,从A开始标记),称为GPIOA—GPIOG。

2024-04-07 22:05:20 2051

原创 对话框与多窗体设计 —— 自定义对话框及其调用

在一个应用程序设计中,为了实现一些特定的功能,必 须设计自定义对话框。自定义对话框的设计一般从 QDialog继承,并且可以采用UI设计器可视化地设计对 话框。对话框的调用一般包括创建对话框、传递数据给 对话框、显示对话框获取输入、判断对话框单击按钮的 返回类型、获取对话框输入数据等过程。Q_OBJECTpublic:// 构造函数,参数为父窗口指针,默认为空指针// 析构函数// 设置姓名和年龄的函数,接受姓名和年龄作为参数// 获取姓名的函数,返回姓名字符串。

2024-01-25 20:59:32 818

原创 对话框与多窗体设计 —— 标准对话框

一个完整的应用程序设计中,不可避免地会涉及多个窗 体、对框框的设计和调用,如何设计和调用这些对话框 和窗体是搞清楚一个庞大的应用程序设计的基础。Qt为应用程序设计提供了一些常用的标准对话框,如打开文件对话框、选择颜色对话框、信息提示和确认选择对话框、标准输入对话框等,用户无需再自己设计这些 常用的对话框,这样可以减少程序设计工作量。QInputDialog有单行字符串输入、整数输入、浮点数输 入、列表框选择和多行文本等多种输入方式。实例:从下拉列表框中输入。实例:输入字符串对话框。

2024-01-25 20:58:58 480

原创 常用界面设计组件 —— 时间日期与定时器

QTimer不是一个可见的界 面组件,在UI设计器的组件面板里找不到它。QTimer主 要的属性是interval,是定时中断的周期,单位是毫秒。QTimer主要的信号是timeout(),在定时中断时发射此信号,要想在定时中断里做出响应,这就需要编写 timeout()信号的槽函数。定时器是用来处理周期性事件的一种对象,类似于硬件 定时器。例如设置一个定时器的定时周期为1000毫秒, 那么每1000毫秒就会发射定时器的timeout()信号,在 信号关联的槽函数里就可以做相应的处理。

2024-01-24 20:40:37 653

原创 常用界面设计组件 —— 容器组件

QStackedWidget列提供了堆叠窗体的效果。为了将界面上的各个组件的分布设计得更加美观,经常 使用一些容器类,如 QgoupBox、QtabWidget、 QToolBox等。QTabWidget 的一种带标签页的窗口,在这种类型的窗 口中可以存储多个子窗口,每个子窗口的显示可以通过 对应的标签进行切换。QToolBox类提供了一列选项卡窗口,当前项显示在当前 选项卡下面,适用于分类浏览、内容展示、操作指引这 一类的使用场景。最终的效果 可以看到页面显示不全,有滑动拉条显示。可以选择垂直布局选项。

2024-01-24 20:40:32 750

原创 常用界面设计组件 —— 按钮组件、布局组件

如果 启用了自动互斥,属于同一个父部件的单选框的行为 就和属于一个互斥按钮组的一样。Qt提供了QHBoxLayout类(水平排列布局), QVBoxLayout类(垂直排列布局),QGridLayout类(网格 排列布局)等基本布局管理。所谓布局, 就是界面上组件的排列方式,使用布局可以使组件有规 则地分布,并且随着窗体大小变化自动地调整大小和相 对位置。:QCheckBox可以有两种状态,也可以有三种 状态(未选中,选中,半选),默认是两种状态。addLayout()方法用于向布局中加入子布局。

2024-01-23 20:28:38 977

原创 常用界面设计组件 —— 数字输入和显示组件

QSpinBox用于整数的显示和输入,一般显示十进制 数,也可以显示二进制、十六进制数,而且可以在显示 框中增加前缀或后缀。QDoubleSpinBox用于浮点数的 显示和输入,可以设置显示小数的位数,也可以设置显 示前缀和后缀。QSlider和QDial 2个组件都从QAbstractSlider继承而 来,有一些共有的属性。QSlider是滑动的标尺型组 件,滑动标尺上的一个滑块可以改变值。QLCDNumber是模拟LCD显示数字的组件,可以显 示整数或小数。对应的成员函数可以查阅QT官方手册。

2024-01-23 20:21:27 638

原创 常用界面设计组件 —— 字符串与输入输出组件(QT)

,并在对话 框里选择 clicked() 信号创建槽函数,在自动生成的函数 体编写如下代码,实现从界面中读取用户输入的数量和 单价,相乘计算后将结果显示到总价对应的文本框里。界面设计时使用最多的组件恐怕就是QLabel和 QLineEdit了,QLabel用于显示字符串,QLineEdit用于 显示和输入字符串。QString提供了大量的功能,有助于灵活实现字符串处理 功能,可以可以通过查看QT帮助手册得到。count() 、size() 和 length()toUpper() 和toLower()

2024-01-15 21:45:38 1147

原创 常用界面设计组件 —— 窗体(QT)

窗体是指程序的整体界面,可以包含标题栏、菜单栏、 工具栏、关闭按钮、最小化按钮、最大化按钮等。QMainWindow、QWidget、QDialog 三个类就是用来创建窗体的,可以直接使用也可以继承后再使用。对话框主要用来执行短 期任务,或与用户进行互动,它可以是模态的也可以是 非模态的。QMainWindow 窗口可以包含菜单栏、工具栏、状态 栏、标题栏等,是最常见的窗口形式,可以作为GUI程 序的主窗口。:窗口左上角的图标显示不出来,是跟ubuntu系统 的显示相关(windows环境下正常显示)。

2024-01-15 21:40:45 1374

原创 模板与STL(C++)

返回类型 函数名(参数表){... ...template是模板定义的关键字写在中的T1 T2…是模板参数中的typename表示其后的参数可以是任意类型的。a:b;return a

2024-01-12 07:53:44 911

原创 文件与流(C++)

istrstream和ostrstream在98标准中废弃,取而代之的是istringstream和ostringstream,实现类似于C语言中sprint和sscanf的效果,不是在标准输入设备中获取数据,操作对象是在缓冲区。istream类定义了许多用于从流中提取数据和操作文件的成员函数,并对流的析取运算符 >> 进行了重载,实现了对内置数据量(基本数据类型)的输入功能。ostream类提供了许多用于数据输出的成员函数,并通过流的输出

2024-01-12 07:49:55 977

原创 异常(C++)

try用于检测可能发生的异常,throw用于抛出异常,catch用于捕获并处理由throw抛出的异常。C++允许限制函数能够抛出的异常类型,限制方法时在函数声明后面添加一个throw参数表,在其中指定函数可以抛出的异常类型。函数fun被限定只允许抛出 int 和 char 类型的异常,当 fun 函数抛出其他类型的异常时,程序将被异常终止。:catch在进行数据异常类型匹配时,不会进行数据类型的默认转换,只有与异常类型精确匹配的catch块才会被执行。:不需要逐层判断,一步到位,代码精炼。

2024-01-10 21:42:52 659

原创 运算符重载(C++)

double y;c2.print();int x = 10;int y = 20;c1 + c2;//想实现和 'int z = x + y;' 一样的功能,这时就要用到运算符重载了return 0;

2024-01-10 21:39:30 864

原创 运行时类型信息 typeid、type_info...(C++)

运行时类型信息(Run-time Type Information,RTTI)提供了在程序运行时刻确定对象类型的方法,是面向对象程序语言为解决多态问题而引入的一种语言特性。由于多态的要求,C++指针或引用可能与他们实际代表的类型不一致(如基类指针可以指向派生类对象),当将一个多态指针转换为其 实际指向类型对象时,就需要知道对象类型信息。向下造型时,动态类型转换会对所需转换的基类指针或引用做检查,如果其目标确实为期望得到的子类类型的对象,则转换成功,否则转换失败。

2024-01-09 20:49:34 508

原创 虚函数实现(C++)

当编译器编译一下test函数时只知道pb是B*类型的指针,并不知道它指向的具体对象类型:pb可能指向的是B的对象,也可能指向的是D的对象。只有当程序执行过程中给test函数传递了具体参数才能确定pb指向了那个对象,从而确定访问那个虚表,从而实现了多态。每个含有虚函数(无论其本身的,还是继承而来的)的类都至少有一个与之对应的虚函数表,其中存放着该类所有的虚函数对应的函数指针。

2024-01-09 20:48:19 744

原创 虚析构函数(C++)

C++允许将析构函数定义为虚函数,为什么?将基类析构函数定义为虚函数。

2024-01-06 20:43:42 495

原创 纯虚函数和抽象类(C++)

假设有图形类Figure,设计计算面积的成员函数area()。Figure只是一个纯抽象意义上的概念,不存在计算面积或体积的具体方法,所以只能将成员函数area()设计为纯虚函数。如果一个虚函数仅表达抽象的行为,没有具体的功能,即只有声明没有定义,这样的虚函数被称为。,抽象类只能最为其他类的基类,不能用来建立对象。如果类中的所有成员函数都是纯虚函数则可以称为。如果类中包含了纯虚函数,那么这个类就是。

2024-01-06 20:41:10 510

原创 虚函数(C++)

多态性是面向对象程序设计语言的又一重要特征,多态(polymorphism)通俗的讲,就是用一个相同的名字定义许多不同的函数,这些函数可以针对不同数据类型实现相同或类似的功能,即所谓的 “一个接口,多种实现”。如果子类提供了对基类函数有效的覆盖,那么通过指向子类对象的基类指针,或者通过引用子类对象的基类引用,调用该虚函数,实际被执行将是子类中的覆盖版本,而不再是基类中的原始版本,这种语法现象被称为。如果将基类中的某个成员函数声明为虚函数,那么子类中与该函数具有。关键字修饰的成员函数称为。

2024-01-05 20:00:10 371

原创 多重继承、继承与组合、多文件编程实例(C++)

C++允许一个类从一个或多个基类派生。如果一个类只有一个基类,称为单一继承。如果一个类具有两个或两个以上的基类,就称为多重继承。钻石继承,一个派生类继承的多个基类又源自一个公共的祖先(公共基类)。当两个不同基类拥有同名成员时,容易产生名字冲突问题。继承与组合是C++实现代码重用的两种主要方法。组合是Has-a的关系,图书馆有图书。继承是ls-a的关系,比如水果和梨。使用作用域限定符解决。

2024-01-05 19:58:50 495

原创 派生类的构造与析构函数(C++)

如果子类构造函数没有显式指明基类部分(基类子对象)的初始化方式,那么编译器将会自动调用基类的无参构造函数来初始化基类子对象。子类的析构函数,无论自己定义的,还是编译器缺省提供,都会自动调用基类的析构函数,完成基类子对象的销毁。如果希望以有参的方式来初始化基类部分,那么必须使用初始化列表来显式指明。

2023-12-29 21:15:36 587

原创 基类与派生类的关系(C++)

重定义:简单的说就是子类中定义了和父类的同名函数,对父类的成员函数造成了隐藏(多态时会进一步限定)private:int m_x;m_z = z;Derived d;//这个地方默认是 派生类中的成员函数//想要搞清楚调用基类还是派生类中的成员函数 加作用域限定符d.print();return 0;

2023-12-29 21:14:48 778

原创 继承的方式(C++)

继承,基于一个已有类创建新类,使新类与已有类具有同样的功能,即新类具有已有类相同的数据成员和成员函数。继承是代码重用的基本工具。已有类称为基类(父类 / 超类),新类称为派生类(子类)。C++的继承可以分为公有继承、保护进程和私有进程。不同继承方式会不同程度影响基类成员在派生类的访问权限。继承方式为public的继承称为公有继承,在这种继承中,基类成员的访问权限在派生类中保持不变。

2023-12-28 21:08:29 552

原创 单例模式(C++)

单例模式(Singleton Pattern,也称为单件模式),使用最广泛的设计模式之一。其意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。面向对象编程中,每个对象都应该抽象代表一个设备,并通过对象完成对某个具体设备的管理和维护。对于有些类只能有一个实例很重要,例如打印机管理器、设备管理器、任务管理器等。加载进程时即完成创建(饿),用不用都创建。使用静态成员变量维护唯一的单例对象。定义静态成员函数用于获取单例对象。用时再创建(懒),不用再销毁。

2023-12-28 21:07:09 831

原创 友元(C++)

类的封装具有信息的隐藏能力,但也带来了访问效率的问题. C++通过友元给某些函数一项特权,可以访问类中的私有成员,使用的关键字是。一个类可以是另一个类的友元,友元类的所有成员函数都是另一个类的友元函数,能够直接访问另一个类的所有成员。对一个类,可以指定他的某个成员函数是另一个类的友元,也就是友元成员函数。友元类不是双向的:B是A的友元类,不意味着A也是B的友元类。友元函数可以直接访问类的私有成员。

2023-12-27 21:23:55 485

原创 静态成员(C++)

C++中希望某个类的多个对象实现数据共享,可以通过static建立一个被局限在类中使用的全局资源,该类型资源被称为静态成员。C语言中可以通过全局变量实现数据共享,在程序的任何位置都可以访问。静态成员变量(可以理解为局限在类中使用的全局变量)被static修饰的成员成员函数即为静态成员函数。被static修饰的成员变量即为静态成员变量。实例化对象时只实现非静态成员变量。在类的外部访问静态成员函数。C++为什么需要静态成员。

2023-12-27 21:22:40 420

原创 string类编程实例

实现一个字符串类String,为其提供可接受C风格字符串的析构函数、构造函数、拷贝构造函数和拷贝赋值函数。

2023-12-26 21:36:38 464

原创 拷贝构造与拷贝赋值(C++)

当两个对象进行赋值操作时,比如 “i2 = i1” 编译器会将其处理为 “i2.operator = (i1) 的成员函数调用形式”,其中 “operator =” 称为拷贝赋值操作符函数,由该函数完成赋值运算,其返回结果就是表达的结果。**深拷贝:**为了避免浅拷贝的问题,获得完整意义上的对象副本,必须自己定义拷贝构造函数,针对指针指向的成员变量,实现对指针指向内容的复制,即深拷贝。如果没有自己定义拷贝赋值操作符函数,编译器会为该类提供缺省的拷贝赋值操作符函数,用于完成两个对象的赋值操作。

2023-12-26 21:35:53 387

原创 构造与析构(C++)

缺省构造函数也称无参构造函数,但其未必真的没有任何参数,为一个有参构造函数的每个参数都提供一个缺省值,同样可以达到无参构造函数的效果。构造函数(constructor)是与类同名的特殊成员函数,主要用来初始化对象的数据成员。如果一个类没有显示定义拷贝构造函数,那么编译器会为其提供一个缺省拷贝构造函数。用一个已定义的对象构造同类型的副本对象,将调用该类的拷贝构造函数。像上一个例子,初始化的类成员的时候就有点麻烦。将其他类型转换为当前类类型需要借助。,转换构造函数只有一个参数。

2023-12-24 21:46:44 813

原创 类与对象(C++)

将数据和操作数据的函数包装在一起的主要目的就是实现的封装和隐藏。隐藏就是不让结构外的函数直接修改数据结构中的数据,只能通过结构体的成员函数对数据进行修改。为此C++中新增了3个访问权限限定符,用于设置结构体中数据成员和函数成员的访问权限。更安全是指结构体将所有成员都默认为public(公共),不够安全;C++中的结构体不仅可以包含不同类型的数据,而且还可以包含操作这些数据的函数。公有成员(函数、数据),可被任何函数访问(结构体内和结构体外)。私有成员(函数、数据),只能被结构体内函数访问。

2023-12-24 21:45:28 445

原创 new和delete(C++)

在C语言中,如果需要使用堆内存,程序员可以用函数malloc()从堆中分配指定大小存储区域,用完之后必须用free()将之归还系统。其中p是指针变量,type是数据类型,用法1 只分配内存,用法2 将分配的堆内存初始化为x,用法3 分配有n个元素的数组。分配不成功返回空指针(NULL)。malloc()函数的使用比较麻烦,除了需要计算需求内存的大小之外,还必须对获得的内存区域进行类型转换。其中p是用new分配的堆空间指针变量。用法1 用于释放动态分配的单个内存,用法2 用于释放动态分配的数组存储区。

2023-12-23 20:18:21 378

原创 内联函数(C++)

不需要建立函数调用时的运行环境,不需要进行参数传递,不需要跳转,效率更高。在函数声明或定义时,将inline关键字加在函数返回类型前面就是内联函数。

2023-12-23 20:17:23 341

原创 函数(C++)

引用型函数参数可能意外修改实参,如果不希望通过引用修改实参本身,可以将其声明为常引用(const),在提高传参效率的同时还可以接收常量型实参。可以将函数的返回类型声明为引用型,这时函数的返回结果就是return后面数据的别名,避免了函数返回值的开销。同一作用域,函数名相同,但是当中的参数必须有所区分(类型、个数、顺序),将构成重载关系。在C++中,函数的形参列表中的形参是可以有默认值的。函数中返回引用,一定要保证在函数返回以后,该引用的目标依然有效。可以将引用用于函数的参数,这时形参就是实参的别名。

2023-12-20 20:57:43 1293

原创 引用(C++)

在变量声明时出现&才是引用运算符(包括函数参数声明和函数返回类型的声明)右值,是指变量对应的内存区域中存储的数据值,是可以 放在赋值号右边的值;​ 1)简化编程,用指针的场景可以用引用替换(尽量减少指针的使用)左值,是指变量对应的那块内存区域,是可以放在赋值号左边的值;const引用(常引用)。在定义引用时一般为左值(变量)。可以使用const进行限制,使他成为不允许修改的常量引用。C++出现了新的概念:引用。引用是某个变量的别名。&的位置是灵活的,一下几种定义完全相同。引用的本质就是指针常量。

2023-12-20 20:55:13 592

原创 类型转换(C++)

1.5 类型转换1.5.1 隐式类型转换1.5.2 显示类型转换

2023-12-19 20:13:59 1057

原创 C++对C语言数据类型的扩展

1.4 C++对C语言数据类型的扩展1.4.1 结构体1.4.2 联合1.4.3 枚举1.4.4 布尔1.4.5 字符串1.5 类型转换

2023-12-19 20:11:05 1206

原创 名字空间(C++)

1.3 名字空间1.3.1名字空间的作用1.3.2 名字空间的定义1.3.3 名字空间成员的访问1.3.4 无名名字空间1.3.5 名字空间嵌套

2023-12-18 20:57:08 468

原创 数据的输入输出(C++)

1.1 第一个c++程序1.2 数据的输入输出1.2.1 流的概念1.2.2 cout 和插入运算符>

2023-12-18 20:53:57 698

原创 【linux】(ubuntu)下 QT 出现的问题

Error while building/deploying project hello_world (kit: FSMP1Qt5) When executing step "Make"Error while building/deploying project hello_world (kit: FSMP1Qt5)When executing step "qmake"

2023-12-16 14:46:28 294

空空如也

空空如也

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

TA关注的人

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