QT6(13)3.3.3 Qt属性系统:为类自定义属性举例,宏 Q_CLASSINFO ( )类的附加信息。3.3.4 信号与槽:connect()函数原型,模板函数 qOverload<T>( )

(36)自定义属性举例

在这里插入图片描述

++ 以及

在这里插入图片描述

++ 宏 Q_CLASSINFO ( , ) 类的附加信息

在这里插入图片描述

++这段代码,老师没有演示。我自己写的总是报错。算了,没心力建完整的项目去摸索研究了。老师说后面有完整的复杂的项目,以后再有机会验证这些知识。谢谢。

(37)3.3.4 信号与槽:connect()函数原型

在这里插入图片描述

++继续:

在这里插入图片描述
在这里插入图片描述

(38)模板函数 qOverload《Args…》( & C :: func ), 谢谢文心 :

#ifdef Q_QDOC
// Just for documentation generation 
//看注释, if 分支仅用于文件生成,看来要学习 #else 分支
template<typename T>
auto qOverload(T functionPointer);
template<typename T>
auto qConstOverload(T memberFunctionPointer);
template<typename T>
auto qNonConstOverload(T memberFunctionPointer);
#else
template <typename... Args> //args... 是成员函数的参数类型包
struct QNonConstOverload    //适用于类的非 const 成员函数
{   // R应该是函数指针类型,T 是类类型
    template <typename R, typename T> //重载了()运算符,使本对象类似于模板函数
    constexpr auto operator()(R (T::*ptr)(Args...)) 
    	const noexcept -> decltype(ptr)
    { return ptr; }         //这是本类的动态成员函数,依附于类对象的存在

    template <typename R, typename T> //本类的静态成员函数,不依附于类对象的存在
    static constexpr auto of(R (T::*ptr)(Args...)) 
    	noexcept -> decltype(ptr)
    { return ptr; }
};

template <typename... Args>
struct QConstOverload  // 本类适合于类 T 里的 const 成员函数
{
    template <typename R, typename T> //重载 ( ) 运算符
    constexpr auto operator()(R (T::*ptr)(Args...) const) 
    	const noexcept -> decltype(ptr)
    { return ptr; }

    template <typename R, typename T> //看来 of( ) 的作用更大
    static constexpr auto of(R (T::*ptr)(Args...) const) 
    	noexcept -> decltype(ptr)
    { return ptr; }
};

template <typename... Args>
struct QOverload : QConstOverload<Args...>, QNonConstOverload<Args...>
{
    using QConstOverload<Args...>::of;   //使父类中的这四个函数可见
    using QConstOverload<Args...>::operator();
    using QNonConstOverload<Args...>::of;
    using QNonConstOverload<Args...>::operator();

    template <typename R>                //ptr 指针指向的函数是普通函数,不再是类的成员函数
    constexpr auto operator()(R (*ptr)(Args...)) 
    	const noexcept -> decltype(ptr)
    { return ptr; }

    template <typename R>
    static constexpr auto of(R (*ptr)(Args...)) 
    	noexcept -> decltype(ptr)
    { return ptr; }
};

//以下看起来像是全局的模板变量定义,且使变量名等同于模板类名。
//此类变量实际是类对象,全局的类对象,才可以以后使用其 ( ) 运算符函数。
template <typename... Args> constexpr inline 
QOverload<Args...> qOverload = {}; // ={} 意思是变量的初始化采用默认值,没啥用

//虽然定义了三个全局变量,但还是上面的 qOverload 对象最强大
template <typename... Args> constexpr inline 
QConstOverload<Args...> qConstOverload = {};

template <typename... Args> constexpr inline 
QNonConstOverload<Args...> qNonConstOverload = {};
#endif

++以下给出文心的教导

在这里插入图片描述
在这里插入图片描述

(39)

谢谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值