Chinaunix首页 | 论坛 | 博客
  • 博客访问: 106863
  • 博文数量: 27
  • 博客积分: 807
  • 博客等级: 军士长
  • 技术积分: 325
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-04 22:11
文章分类
文章存档

2012年(1)

2011年(14)

2010年(12)

分类:

2010-05-29 17:07:54

1.Qt源码分析之QObjecthttp://blog.csdn.net/oowgsoo/archive/2007/03/14/1529284.aspx

2.Qt源码分析之信号和槽机制http://blog.csdn.net/digu/archive/2007/09/26/1801616.aspx
http://blog.csdn.net/oowgsoo/archive/2007/03/14/1529411.aspx

零碎笔记
1.
1.1:QObjecPrivate的设计,句柄实体模式,平行体系
1.2:Q_DECLARE...宏
1.3:析构,QPointer,信号槽记录,定时器,事件,连带子类(children objects)……
2.
2.1:多态的底层实现机制,c++,信号槽机制其实就是按照名称查表,元数据表(meta object)
2.2:真正的元数据应该是qt_meta_data_QObject加上qt_meta_stringdata_QObject
2.3:信号类+信号索引+槽类,槽索引作为记录写到了全局的connect列表中
2.4:找全局的connect列表,全局链表connectionList,sender hash
2.5:去掉调试信息之后的connect函数
bool QObject::connect(const QObject *sender, const char *signal,
                      const QObject *receiver, const char *method,
                      Qt::ConnectionType type)
{

    QByteArray tmp_signal_name;
 // 得到元数据类
    const QMetaObject *smeta = sender->metaObject();
    ++signal; //skip code跳过信号标记,直接得到信号标识
 // 得到信号的索引
    int signal_index = smeta->indexOfSignal(signal);
    if (signal_index < 0) {
        // check for normalized signatures
        tmp_signal_name = QMetaObject::normalizedSignature(signal).prepend(*(signal - 1));
        signal = tmp_signal_name.constData() + 1;
        signal_index = smeta->indexOfSignal(signal);
        if (signal_index < 0) {
            return false;
        }
    }

    QByteArray tmp_method_name;
    int membcode = method[0] - '0';
    ++method; // skip code

  // 得到元数据类
    const QMetaObject *rmeta = receiver->metaObject();
    int method_index = -1;
 // 这里是一个case,信号即可以和信号连接也可以和槽连接
    switch (membcode) {
    case QSLOT_CODE:
  // 得到槽的索引
        method_index = rmeta->indexOfSlot(method);
        break;
    case QSIGNAL_CODE:
  // 得到信号的索引
        method_index = rmeta->indexOfSignal(method);
        break;
    }
    if (method_index < 0) {
        // check for normalized methods
        tmp_method_name = QMetaObject::normalizedSignature(method);
        method = tmp_method_name.constData();
        switch (membcode) {
        case QSLOT_CODE:
            method_index = rmeta->indexOfSlot(method);
            break;
        case QSIGNAL_CODE:
            method_index = rmeta->indexOfSignal(method);
            break;
        }
    }

    if (method_index < 0) {
        return false;
    }

    int *types = 0;
    if (type == Qt::QueuedConnection
            && !(types = ::queuedConnectionTypes(smeta->method(signal_index).parameterTypes())))
        return false;


 // 调用元数据类的连接
    QMetaObject::connect(sender, signal_index, receiver, method_index, type, types);
 // 发送连接的通知,现在的实现是空的
    const_cast(sender)->connectNotify(signal - 1);
    return true;
}


阅读(2140) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~