qt 获取当前类的名称

在 Qt 中获取当前类的名称可以通过以下两种常见方式实现,具体取决于类的类型:


方法 1:针对 QObject 派生类(推荐)

如果当前类是 QObject 的子类(如 QWidgetQMainWindow 等),可以直接使用 Qt 元对象系统的 metaObject() 方法:

#include <QMetaObject>

// 在类的成员函数内部
QString className = this->metaObject()->className();
qDebug() << "Current class name:" << className;

输出示例

Current class name: "MyClass"

优点

  • 直接返回清晰的类名字符串(如 "MyClass")。
  • 无需处理编译器名称修饰(Name Mangling)。

方法 2:通用 C++ 类(非 QObject 子类)

对于普通 C++ 类,可以使用 typeid 运算符结合编译器提供的 Demangling 函数:

#include <typeinfo>
#include <cxxabi.h> // 需要编译器支持(如 GCC/Clang)

// 工具函数:将编译器修饰的名称转换为可读字符串
std::string demangle(const char* name) {
    int status = -4; // 未知状态
    char* demangled = abi::__cxa_demangle(name, nullptr, nullptr, &status);
    std::string result = (status == 0) ? demangled : name;
    free(demangled);
    return result;
}

// 使用示例
class MyClass {
public:
    void printClassName() {
        std::cout << "Class name: " 
                  << demangle(typeid(*this).name()) 
                  << std::endl;
    }
};

输出示例

Class name: MyClass

注意

  • abi::__cxa_demangle 是 GCC/Clang 特有的函数,其他编译器(如 MSVC)可能需要不同实现。
  • 对于非 QObject 类,typeid(*this).name() 可能返回编译器修饰的名称(如 7MyClass),需 Demangling 处理。

总结

方法适用场景输出示例
metaObject()->className()QObject 派生类"MyClass"
typeid + demangle普通 C++ 类(需编译器支持)"MyClass"

根据实际场景选择合适的方法。如果类继承自 QObject,优先使用 metaObject() 方法,它更简洁且跨平台。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值