Qt源码分析之corelib

Qt源码解析

备注:使用vs2010编译的qt4.8.4版本。

1.corelib模块:

   首先我们来看QObject类,他是所有Qt对象的基类,也是Qt对象模型的中心。主要包括的功能有:信号和槽机制,事件和事件过滤器,国际化,定时器,对象结构树,对象销毁指针自动设置为0等。

我们来看看头文件:

Q_CORE_EXPORTvoid qt_qFindChildren_helper(const QObject *parent, const QString &name,const QRegExp *re,const QMetaObject &mo, QList<void *> *list);
Q_CORE_EXPORTQObject *qt_qFindChild_helper(const QObject *parent, const QString &name,const QMetaObject &mo);
定义了两个函数,主要是用来查找相关的子类。

看看实现:

void qt_qFindChildren_helper(const QObject *parent, const QString &name, constQRegExp *re,
                             const QMetaObject&mo, QList<void*> *list)
{
    if (!parent || !list)
        return;
    const QObjectList &children =parent->children(); //通过对象结构树进行循环查询子类
QObject*obj;
for(int i = 0; i < children.size(); ++i) {
obj= children.at(i);
if(mo.cast(obj)) {
if(re) {
if(re->indexIn(obj->objectName()) != -1)
list->append(obj);
}else {
if(name.isNull() || obj->objectName() == name)
list->append(obj);
}
}
qt_qFindChildren_helper(obj,name, re, mo, list);
    }
}

可以看出,返回 void helper 主要是通过父对象调用 children() 函数然后对子对象数组进行循环遍历,查找符合正则表达式的子类。

在这个两个函数的实现过程中运用了Qt metaObject 系统,我们以这两个函数的分析作为切入点来看看这个所谓的Qt metaObject系统。

这个系统主要基于的是三个方面的内容:QObject作为Qt系统的基类,提供了方便的一套完整的对象树系统;Q_OBJECT提供了QMataObject功能、信号槽、动态属性;moc编译器,为每个QObject子类动态生成相关的支持Qt metaObject代码。

我们从Q_OBJECT宏开始,可以说这是Qt得以构建的基础。

/*tmake ignore Q_OBJECT */
#defineQ_OBJECT \
public:\
    Q_OBJECT_CHECK \
    static const QMetaObject staticMetaObject;\  

    Q_OBJECT_GETSTATICMETAOBJECT \
    virtual const QMetaObject *metaObject()const; \
    virtual void *qt_metacast(const char *); \
    QT_TR_FUNCTIONS \
    virtual int qt_metacall(QMetaObject::Call,int, void **); \
private:\
    Q_DECL_HIDDEN static constQMetaObjectExtraData staticMetaObjectExtraData; \
    Q_DECL_HIDDEN static voidqt_static_metacall(QObject *, QMetaObject::Call, int, void **);
 
#defineQ_OBJECT_CHECK \
    template <typename T> inline voidqt_check_for_QOBJECT_macro(const T &_q_argument) const \
    { int i = qYouForgotTheQ_OBJECT_Macro(this,&_q_argument); i = i; }
template<typename T>
inlineint qYouForgotTheQ_OBJECT_Macro(T, T) { return 0; }
 
template<typename T1, typename T2>
inlinevoid qYouForgotTheQ_OBJECT_Macro(T1, T2) {}
 
 
#  define QT_TR_FUNCTIONS \
    static inline QString tr(const char *s,const char *c = 0) \
        { return staticMetaObject.tr(s, c); } \
    static inline QString trUtf8(const char *s,const char *c = 0) \
        { return staticMetaObject.trUtf8(s, c);} \
    static inline QString tr(const char *s,const char *c, int n) \
        { return staticMetaObject.tr(s, c, n);} \
    static inline QString trUtf8(const char *s,const char *c, int n) \
        { return staticMetaObject.trUtf8(s, c,n); }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值