零基础C++开发上位机--基于QT5.15的串口助手(二)

本文介绍了Qt编程中的信号与槽概念,展示了如何在Ui中使用QPushButton的clicked信号,以及如何通过自动和手动关联实现按钮点击事件的响应。同时,文章概述了面向对象编程在Qt中的重要性,包括封装、继承和多态,并解释了main函数和QApplication在Qt程序中的作用。
摘要由CSDN通过智能技术生成

上节课我们简单跑了一个Ui的例子,Ui显示了一个文本hello world和一个点击的按钮。因为我们没有做任何的编程处理,所以目前点击按钮没有任何反应,接下来详细丰富按钮的功能,我们来事先以下按钮的互动效果。

一、信号与槽

在那之前,我们需要学习一下理论知识。信号与槽的概念是QT编程的重要基础,它可以让互不相干的对象,比如说我们上一节例子提供的文本和按钮之间建立一种联系,让它们的交互操作变得直观、简单。

1.信号的概念

上图中,我们Ui中的按钮被称为PushButton,它属于QPushButton类。那我们就在帮助文件中找一下这个类的详细说明。

点击左侧菜单栏的“帮助”,再点击QPushButton类,查看详细说明。在其下方并没有出现signal信号相关的说明,那我们在上一级点击它继承的类“QAbstractButton”。

在“QAbstractButton”类中,我们找到了要找的singal信号,也就是说,”QPushButton“类同样具有这些信号。分别我们可以做clicked--点击,pressed--按下按键,release--释放按键,toggled容易跟点击混淆,暂时不谈。其中clicked很好理解,pressed和release就是按键点击的过程,这俩一般是成对使用,按下时候执行什么操作,释放松手时候再执行什么操作。这里面最常用的就是clicked()。以上就是信号的概念。

2.槽的概念

槽:就是函数的意思,我们可以通过connect函数将槽函数和上面将的信号关联到一起。实际效果就是点击pushbotton就会有信号signal发出,然后带动关联的槽函数处理响应的操作。通过这个过程去执行槽函数的内容。所以槽可以理解为最终的效果,即动作函数。

3.信号和槽的关联

a.自动关联

回到Ui界面,右键点击我们的按钮,然后选择”转到槽“

在弹出的窗口,我们直接选择默认的clicked()信号。

系统会自动跳转程序中并生成一个槽函数。

同时在widget.h中会自动声明该槽函数的。

接下来我们在槽函数中,随意编写一条调试信息。

 qDebug("hello world."); // 当按键被点击的时候,会输出调试信息hello world.

运行程序后,我们可以看到程序每点击一下按钮,就输出一次hello world的字符。

b.手动关联

手动关联,需要使用我们刚才提到的connect函数,去手动关联信号与槽。

我们需要在widget函数中增加connect这个函数。

 connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(on_pushButton_clicked()));

connect(A,SIGNAL(B),C,SLOT(D))这就是connect函数的架构,当A这个对象发出SIGNAL(B)这个信号时候,就会触发对象C的槽函数SLOT(D)。

二、程序架构

目前我们已经设计了两个小工程了,但是我们还没有仔细研究过程序。总所周知,C++主要是面向对象的编程,而以往我们做的都是面向过程的编程。

面向过程的编程强调的是将程序划分为一系列的步骤,每个步骤都是一个函数或过程,通过函数的调用和参数传递来实现数据的处理和操作。程序的执行过程是按照线性的顺序进行的,从上到下依次执行每个步骤。它不关注数据的状态和对象之间的交互,而是将问题抽象为一系列的操作步骤,通过顺序执行这些步骤来解决问题。它注重了程序的逻辑性和结构化,使得程序的编写和维护更加简单和直观。

面向过程的编程适合用于解决一些简单和直接的问题,其特点是简单直观、执行效率高。但是对于复杂的问题,面向过程的编程会导致程序结构复杂,代码可读性差,并且不利于代码的重用和模块化。因此,在面对复杂问题时,面向对象的编程更加适用。

面向对象的编程有以下特点:

  1. 封装性(Encapsulation):将数据和方法封装在对象中,只暴露必要的接口给外部访问。通过封装,可以隐藏对象内部的实现细节,提高代码的可维护性和复用性。

  2. 继承性(Inheritance):通过继承可以创建新的类,新类继承现有类的属性和方法。通过继承,可以实现代码的重用,并且可以建立类之间的层次关系。

  3. 多态性(Polymorphism):多态性指的是同一操作可以有不同的行为,它允许以统一的方式使用不同类型的对象。通过多态性,可以提高代码的灵活性和可扩展性。

面向对象的编程可以提高代码的可读性、可维护性和可重用性,它已成为现代编程的主要范型之一。在许多编程语言中,如Java、Python和C++等都支持面向对象的编程。

1.main.cpp

我们看一下所谓的int main这个主函数。在main处右击选择切换到函数声明\定义。

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}

通过跳转的页面得知,main其实就是代表qMain,在编译的时候,程序中的main函数名会被替换为qMain。

因此可知,这并不是大家所理解的main主函数,而是一个普通的qMain函数,该函数有系统库中的默认入口函数WinMain()调用。各位同学在Qt中打开安装目录中的qtmain_win.cpp文件,可以看到该文件中有个WinMain()函数。在程序运行时会先执行WinMain()函数,而该函数中的语句:

const int exitCode = main(argc,argv);

调用了自己编写的qMain()函数。

下来QApplication应用程序类的对象a用于处理应用程序的初始化和收尾工作,无论程序中有多少窗口或者没有窗口,都需要有且仅有一个该类的对象,此为固定模式。

紧接着就是定义了一个基本窗口类型的对象w,并调用show()成员函数将自己显示出来。然后由应用程序对象a调用自身的成员函数exec()开始应用程序的事件循环和处理,直到exit()函数被调用或者主窗口被销毁时exec()函数执行结束,则结束整个程序。

稍微有些晦涩难懂,不要紧,这些都是固定模式,大家注意遵循原有的程序框架不要改就可以了。

2.widget.cpp

widget.cpp是界面窗口的应用函数,是需要我们编写功能互动等程序的地方。那具体的程序就五花八门,看各位大神的能力了。

widget.cpp可能包含以下内容:

  1. 创建和初始化窗口小部件的代码:widget.cpp中的代码可以用于创建窗口小部件,并设置其大小、位置、样式等属性。
  2. 响应用户交互的代码:widget.cpp中的代码可以处理用户的输入事件,例如鼠标点击、键盘输入等,以实现相应的交互功能。
  3. 绘制窗口小部件的代码:widget.cpp中的代码可以通过绘制函数(如paintEvent)来绘制小部件的外观,包括文本、图像、背景等。
  4. 更新窗口小部件状态的代码:widget.cpp中的代码可以根据需要更新窗口小部件的状态,包括显示不同的文本、图像等内容。
  5. 与其他窗口小部件交互的代码:widget.cpp中的代码可以与其他窗口小部件进行通信和交互,例如发送信号、接收信号,并更新相应的界面。
  6. 对窗口小部件的布局和样式进行管理的代码:widget.cpp中的代码可以调用布局管理器(如QLayout)来管理小部件的布局,以及设置小部件的样式和外观。

总之,widget.cpp的功能是实现一个窗口小部件的各种行为和交互逻辑,使其能够在界面上进行显示和操作。具体的功能和实现方式取决于具体的需求和设计。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

永远都是新手

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值