QT学习笔记(跟练版)

QT学习

一.信号和槽

1.基本概念

信号(Signals)和槽(Slots)是Qt框架中用于实现对象间通信的重要机制。它们使得不同的对象能够通过事件和数据进行交互,而无需直接相互引用。

2.实践

在接下来我们将用一个简单的例子来讲解这一知识点:当点击按钮时,对应的标签会随之改变。

  1. 创建一个qt项目
  2. 我们来想想这个项目要用到哪些东西,按钮,标签,信号槽,如果为了美观还要增加一些布局。那我们先来做一些准备。
    首先要在头文件里引入标签Qlabel并在widget组件中建立对应的成员label,还有相关的QHBoxLayout( Qt 框架中的一个布局类,用于在水平方向上排列子部件(widgets))、QPushButton在这里插入图片描述
  3. 然后就可以开始编写了,在wiget.cpp文件里进行,先加入一个按钮。
    在这里插入图片描述

现在你以及运行出了这个程序
然后我们加入标签
在这里插入图片描述

运行后,就得到了它,太乱了对吧?接下来就要简单布局一下。在这里插入图片描述
我们的QHBoxLayout就出场了,先创建一个对象,随后将按钮和标签加入。在这里插入图片描述

这里的运行结果大概和你的不太一样,因为在我们调用addWidget的时候有先后顺序,先加入的在前,后加入的在后。这就是调换顺序的结果。
在这里插入图片描述

  1. 现在开始下一阶段,我们要做一些功能相关的东西了。
    回到头文件,我们要对槽以及对应的槽函数进行声明。
    这里做一下补充: 槽函数(Slot Function)是Qt框架中用于响应信号(Signal)的特殊成员函数。信号和槽是Qt中的一种机制,用于实现对象之间的通信。当某个事件发生或者特定的条件满足时,对象可以发出信号,其他对象可以连接到这个信号并执行相应的槽函数。
    不知道大家有没有这样的疑问·,为什么又单独声明了一次槽函数?在早期版本的 Qt 中,槽函数必须使用 slots 关键字进行独立声明。这是因为 Qt 的元对象系统需要知道哪些函数是槽函数,以便在运行时建立信号和槽之间的连接。在较新的 Qt 版本(Qt 5 及以后),不再需要使用 slots 关键字来显式声明槽函数。你可以将任何成员函数声明为槽函数,只要它们遵循特定的命名约定,并且在 QObject 的派生类中。特定的命名约定是:函数名称以 on_ 开头,后面跟着信号的名称,例如 on_buttonClicked。在这里插入图片描述
    声明后就要开始编写了,这里函数作用是对标签进行一些调整,当然还有关键的一步,connect 是Qt框架中用于建立信号和槽连接的函数。它允许你在一个对象发出信号时,将这个信号连接到另一个对象的槽,从而实现对象之间的通信。下面我将详细解释 connect 函数的语法和使用方法。

connect 函数的基本语法如下:

connect(sender, SIGNAL(signal), receiver, SLOT(slot));

其中:

  • sender:发出信号的对象。
  • SIGNAL(signal):表示一个信号,通过宏来定义,比如 SIGNAL(clicked()) 表示按钮的 clicked 信号。
  • receiver:接收信号的对象。
  • SLOT(slot):表示一个槽,也通过宏来定义,比如 SLOT(addButtonClicked()) 表示接收对象的 addButtonClicked 槽。

在新版本的Qt(包括Qt 6)中,也可以使用更现代的语法,不再需要使用宏。新语法如下:

connect(sender, &Sender::signal, receiver, &Receiver::slot);

在这里插入图片描述
运行结果如下(点击后)在这里插入图片描述
这就是本小节的全部内容,望各位指正。

二.单选按钮和关于布局的一些知识

还记得上文中的QHBoxLayout吗?我们只提到了布局需要这个东西,那他具体是什么呢?今天我们来详细了解下关于布局的一些知识,要编写的程序也将围绕着单选按钮QRadioButton展开。

1.基础知识

QRadioButton是 Qt 框架中的一个部件(widget),它是一个单选按钮,用于在一组选项中选择一个选项。单选按钮通常用于从一组互斥选项中选择一个,比如性别选择、选项选择等场景。

2.实践

  1. 第一步,引入相关头文件
    引入头文件
  2. 就开始做具体的功能了,下面代码会生成三个选项:
    做一个上下方向的选项布局

运行结果如下:
运行结果
是不是和上次的布局不太一样了,在上一节中的明明是左右分布的啊。因为上一节中我们用到的布局是QHBoxLayout,这一节中用到的是QVBoxLayout,二者有什么区别呢?
QHBoxLayout 和 QVBoxLayout 是 Qt 框架中的两种布局类,用于在窗口中排列部件。它们之间的区别在于排列的方向:水平和垂直。
QHBoxLayout(Horizontal Box Layout):它按照水平方向排列部件,从左到右。适用于创建水平工具栏、按钮组等。
QVBoxLayout(Vertical Box Layout):它按照垂直方向排列部件,从上到下。适用于垂直排列的元素,如表单、列表等。
当然,除了 QHBoxLayout 和 QVBoxLayout,Qt 框架还提供了其他几种布局类,用于实现不同的界面布局需求。以下是一些常见的其他布局类:
QGridLayout:网格布局,将部件按行和列组织成网格状。适用于创建表格形式的布局,例如表单、网格图等。
QFormLayout:表单布局,用于创建标签和输入字段的对应布局。适用于创建输入表单,其中每个输入字段都与一个标签对应。
QStackedLayout:堆叠布局,将多个部件叠放在同一位置,但只显示其中一个。适用于切换不同内容的场景,如选项卡。
QSplitter:分割器布局,用于创建可调整大小的部件区域,用户可以拖动分割器来改变区域的大小。

除了这些,我们还可以进行嵌套布局。下面是对代码的一些更改:
加入了嵌套布局
运行结果:
运行结果

补充:经过一些指正,这段代码更改如下
My Image

在这个修复后的版本中,去除了在 QHBoxLayout 和 QVBoxLayout 构造函数中传递 this 参数(原来可能导致不必要的内存管理问题)。而是直接使用布局的对象进行操作。还使用 setLayout(vbox) 将主布局设置为 vbox,以确保布局正确应用到窗口。

虽然这个例子不需要,但较复杂的程序中,要记得Wiget类中添加相关的析构函数。

本节内容就到这里,望各位批评指正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值