从零开始编写一个上位机(串口助手)QT Creator + C++

本文详细介绍了使用C++和Qt Creator开发串口上位机的过程,涵盖C++基础知识、Qt界面设计、信号与槽机制、控件使用等。通过实例展示了如何创建对象、使用类成员、处理输入输出以及实现类的继承和虚函数。此外,还探讨了Qt的资源管理、布局设计以及窗口界面的创建,最后讲解了如何打包成Windows软件并提供了源码下载。

提示:本博客作为学习笔记,有错误的地方希望指正,此文可能会比较长,作为学习笔记的积累,希望对来着有帮助。
  绪论:笔者这里使用的是QTCreator和C++来实现一个简单的串口上位机的开发的简单过程,使用到C++,主要是为了后面使用Python开发上位机打下基础。这里主要分为初识C++的一些基本知识,其次是QT Creator的使用。特别声明感谢【北京迅为】嵌入式学习之QT学习篇的学习视频,这里的学习笔记就是根据视频中的内容实战记录下来的。B站演示视频

一、C++知识

1、初识C++

  什么是C++,C++就是C语言的升级版本,C++面向对象,而C是面向过程的一种语言,是一种高级语言。

2、C++输入输出控制

  C++中使用cout 作为输出控制,使用cin作为输入控制,相比C语言更加灵活和方便。

2.1、C++的输出控制cout

  在C++中使用的是cout来控制输出的,与c中的printf不同的是cout可以实现数据类型的相应调整行为,使用printf的输出需要时候需要使用输出控制符%d,%c,%u等等的方式,但是C++中使用cout不需要使用输出控制符。需要包含#include <iostream>的头文件
因为cout是std库中的一个类的对象,所以使用的方法是 std::cout ,如下

例如:cout << "Hello World!" << endl;

2.2、C++的输入控制cin

  cin是C++编程语言中的标准输入流对象,即istream类的对象。cin主要用于从标准输入读取数据,这里的标准输入,指的是终端的键盘。此外,cout是流的对象,即ostream类的对象,cerr是标准错误输出流的对象,也是ostream 类的对象。这里的标准输出指的是终端键盘,标准错误输出指的是终端的屏幕。
  在理解cin功能时,不得不提标准输入缓冲区。当我们从键盘输入字符串的时候需要敲一下回车键才能够将这个字符串送入到缓冲区中,那么敲入的这个回车键(\r)会被转换为一个换行符\n,这个换行符\n也会被存储在cin的缓冲区中并且被当成一个字符来计算!比如我们在键盘上敲下了123456这个字符串,然后敲一下回车键(\r)将这个字符串送入了缓冲区中,那么此时缓冲区中的字节个数是7 ,而不是6。
  cin读取数据也是从缓冲区中获取数据,缓冲区为空时,cin的成员函数会阻塞等待数据的到来,一旦缓冲区中有数据,就触发cin的成员函数去读取数据。
使用cin从标准输入读取数据时,通常用到的方法有cin>>,cin.get,cin.getline。

3、C++对象和类

  其中C++的灵魂在于C++的类,类的关键字是使用class处理,在类中包含的是成员变量, C++的类和C语言中的结构体有点相像,类中的成员变量就有点类似C中结构体的成员变量,类中的成员变量不仅是变量还可以是函数,对象就是类的实例化。类似于定义结构体变量。
  一个简单的C++类例子:

class student
{
   
   
public:                             //类的公共变量
    student();                      //构造函数,对象实例化(创建)的时候调用
    student(int a);                 //构造函数的重载函数
    ~student();                     //析构函数,对象删除的时候调用
    char name[10];
    int age;                        //类的成员变量
    void Test1(void){
   
                  //在类中声明和实现函数
        cout<<"My name is Test1"<<endl;
    };
    void Test1(int a);              //类函数的重载特性
    void Test2();                   //在外部实现类的函数
    virtual void Test_Virtual();    //虚函数
    virtual void Test_VirtualA(){
   
   }; //纯虚函数
private:                //私有变量
    char name_haha = 'W';
};

3.1、定义一个对象:

  1. 直接定义,tudent stu;
  2. 在堆里面定义,stdent *stu = new student;
  3. 删除对象,delete stu;
    student My_student;                         //实例化类  My_student(对象)
    student * My_student1 = new student;        //实例化类 指针
    delete My_student1;                         //删除对象

注意:这样只可以删除在堆里面定义的对象,不能删除直接定义的。目的释放堆里面的内存。

3.2、使用一个对象:

  1. 直接定义的使用 stu.name;
  2. 在堆里面定义的使用 stu->age;使用指针访问。

  C++访问对象方法和C语言访问结构体的方法一样的,直接定义使用“.”来访问,在堆里面定义的指针话使用“->”来访问。

    student My_student;                         //实例化类  My_student(对象)
    student * My_student1 = new student;        //实例化类 指针
    student * My_student2 = new student(168);   //实例化类(定义一个对象)调用构造函数的重载函数
    My_student.name[0] = 'w';                   //使用对象对类中的成员变量设置值
    My_student.age  = 24;                       //使用对象对类中的成员变量设置值
    My_student.Test2();                         //使用类中的函数,使用函数和只用变量一样的
    My_student.Test1();                         //调用函数
    My_student.Test1(168);                      //调用重载函数
    My_student.Test_Virtual();                  //调用虚函数
    My_student1->age = 24;
    My_student1->name[1] = 'w';

3.3、类中的函数

  1. 再类里面声明
  2. 实现函数,实现函数可以在类中写,也可以在函数外面写,写在类中会比较长,显得臃肿。在函数外面实现函数的话需要加入函数的类名。需要加入“::”,不加入的话就会默认为普通函数。
class Peple
{
   
   
public:                             //类的公共变量
    void Test(void){
   
                   //在类中声明和实现函数
        cout<<"My name is Test1"<<endl;
    };
    void Test1();
};
//类外实现函数
void Peple::Test1(void)
{
   
   
    cout<<"My name is Test1"<<endl;
}

3.4、类的访问修饰符

  1. public: 表示函数和变量都是公开的,任何人都可以访问。
  2. private:标志函数的变量只能在自己的类里面自己访问自己,不能通过对象来访问。可以通过类中的函数来实现强行访问私有变量。
  3. protected:表示函数和变量只能在自己的类里面访问自己,但是可以通过派生类来访问的。
class People
{
   
   
public:
    char People_name  = 168;
private:
    char People_name1 = 66;
protected:
    char People_name2 = 99;
};

4、C++类属性

4.1、类函数的重载特性

  类函数的重载特性就是我们可以在类中定义的函数可以同名,但是参数不同的函数。重载函数的调用的时候会根据参数的个数自动调用哪一个函数。

class People
{
   
   
public:
    void Test_People_Number(int day);
    void Test_People_Number(int day,int time);
};

4.2、构造函数和析构函数

构造函数:假如定义了构造函数,当对象被创建的时候,就会出发这个函数。
析构函数:假如定义了析构函数,当对象被删除或者生命周期结束的时候就会触发析构函数
定义析构函数和构造函数:

  1. 构造函数和析构函数的名字必须于类名一样的。
  2. 析构函数要在前面加上一个“~”。

  使用new创建的对象是在堆中创建的,函数执行结束后不会自动释放,使用delete就可以实现对象的释放,这个时候就会触发类的析构函数。
  构造函数是可以被重载的,析构函数是不会被重载的。当使用构造函数的重载特性的时候,类的实例化(定义一个对象)只能通过堆的方式来实例化一个对象。student * My_student2 = new student(168);

class student
{
   
   
public:                             //类的公共变量
    student();          
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值