知识点1:类型转换(动态类型转换,静态类型转换)
动态类型转换使用dynamic_cast运算符进行,是程序在运行的过程中进行类型转换,转换不成功会返回空指针或者抛出异常。
动态转换示例代码:

打印结果:

静态转化示例代码:
static_cast
运算符

结果是一样的,但是静态类型转换可能会
导致精度损失或不安全的转换,因此在使用时需要谨慎。
Qt元对象当中也有一个类似于动态类型转化qobject_cast(用于在对象的基类和派生类之间进行类型转换)
示例代码:
在这个示例中,我们创建了一个基类 Base 和一个派生类 Derived。然后我们尝试使用qobject_cast 将一个 Base 对象转换为 Derived 对象,
这应该会失败,因为 base 不是Derived 对象。同样地,我们将一个 Derived 对象尝试转换为 Base 对象,这应该会成功。

知识点2:Q_INVOKABLE宏的使用
不加
Q_INVOKABLE 也可以在信号槽中使用,但是这可能会带来一些限制。使用
Q_INVOKABLE 宏可以确保成员函数能够被正确地处理和调用,
尤其是在涉及到跨线程通信时。当使用 Qt 的信号槽机制时,
Q_INVOKABLE 宏可以确保成员函数的调用符合 Qt 的元对象系统要求。这样,当
发出信号时,Qt 可以正确地查找和调用目标槽函数。虽然不使用
Q_INVOKABLE 也可以在信号槽中使用成员函数,但是这样可能会导致一些限
制和潜在的问题。例如,如果成员函数的参数类型不符合信号槽机制的要求,可能会导致无法正确连接信号和槽。因此,为了确保信号槽的正
常工作和最佳的代码可读性,建议在使用 Qt 的信号槽机制时,使用
Q_INVOKABLE 宏来标记可调用的成员函数。这个关键字在Qt库当中使用了
很多。

知识点3:QVariant的使用(非常好用的类)
它是一个通用的数据类型,可以用来存储各种类型的数据。它类似于 C++ 中的
union 数据类型,可以存储不同的数据类型,但每次
只能存储
一种类型。QVariant 支持的数据类型包括整数、浮点数、字符串、数组、字典等(太复杂和自定义类不ok)。
它提供了很多方法来操作和查询存储在其中的数据。
重点:
在信号和槽连接时,可以使用 QVariant 来传递参数。这样可以将不同类型的数据传递给槽函数,而不需要编写额外的转换代码。
QVariant代码示例:
