Try your best to provide an mechanism to implement what you want.

1. All is generated by QT Framework before compiling.

QObject.connect(sender,SIGNAL(signal()), reciver,SLOT(slot()));

==>

QObject.connect(sender, “2signal( )”,reciver,”1slot()”);
 class QExample : public QObject
{ Q_OBJECT public:
QTestA (QObject *parent ); ~QTestA ();
signals:
void SignalA1 ();
void SignalA2 (int i ); public slots:
void SlotA1 ();
void SlotA2 (char *szBuf ,int nSize );
private: public: int qt_metacall (QMetaObject ::Call _c , int _id , void **_a )
{
_id = QObject ::qt_metacall (_c , _id , _a );
if (_id < )
return _id ;
if (_c == QMetaObject ::InvokeMetaMethod )
{
switch (_id ) {
case : SignalA1 (); break ;
case : SignalA2 ((*reinterpret_cast < int (*)>(_a []))); break ;
case : SlotA1 (); break ;
case : SlotA2 ((*reinterpret_cast < char *(*)>(_a [])),(*reinterpret_cast < int (*)>(_a []))); break ;
default : ;
}
_id -= ;
}
return _id ;
} };

2. Add additional meta data and function in class

  QMetaObject
{
const QMetaObject *superdata ;
const char *stringdata ; //save class name, signal name, parameter name,slot name, all ended by '/0'
const uint *data ; //int array, store information of QMetaObjectPrivate
}
 struct QMetaObjectPrivate

 {

     int revision ;
int className ;
int classInfoCount , classInfoData ;
int methodCount , methodData ;
int propertyCount , propertyData ;
int enumeratorCount , enumeratorData ;
int constructorCount , constructorData ;
};

3. Define your own macro, translate user input string into the real code

All below is added in order to find the right ID for cooresponding method of signal and slot

Example:

 static const uint qt_meta_data_Q QExampleData[] = {
, // revision
, // classname
, , // classinfo
, , // methods and its data
, , // properties
, , // enums/sets
, , // constructors
// 以上部分 是QMetaObjectPrivate 结构信息
// signals: signature, parameters, type, tag, flags
, , , , 0x05,
, , , , 0x05,
// slots: signature, parameters, type, tag, flags
, , , , 0x0A,
, , , , 0x0A,
// end
};
// slots: signature, parameters, type, tag, flags
1 static const char qt_meta_stringdata_Q QExampleMetaData [] = {
"QTestA/0/0SignalA1()/0i/0SignalA2(int)/0"
"SlotA1()/0szBuf,nSize/0SlotA2(char*,int)/0"
};

4.And connection object to list

 QMetaObject::connect(sender, signal_index,receiver, method_index,type, types);
QObject *s =const_cast<QObject*>(sender);
QObject*r = const_cast<QObject *>(receiver); QOrderedMutexLockerlocker(&s->d_func()->threadData->mutex, &r->d_func()->threadData->mutex); QObjectPrivate::Connection c; c.receiver = r;
c.method = method_index;
c.connectionType = type;
c.argumentTypes= types; s->d_func()->addConnection(signal_index, &c);
r->d_func()->refSender(s, signal_index);

QObject::connect(const QObject *sender,
const char *signal,
const QObject *receiver,
const char *method,
Qt::ConnectionType type)
{
{
const void *cbdata[] = { sender, signal, receiver, method, &type };
if (QInternal::activateCallbacks(QInternal::ConnectCallback, (void **) cbdata))
return true;
} if (sender == || receiver == || signal == || method == ) {
qWarning("QObject::connect: Cannot connect %s::%s to %s::%s",
sender ? sender->metaObject()->className() : "(null)",
(signal && *signal) ? signal+ : "(null)",
receiver ? receiver->metaObject()->className() : "(null)",
(method && *method) ? method+ : "(null)");
return false;
} QByteArray tmp_signal_name; if (!check_signal_macro(sender, signal, "connect", "bind"))
return false; const QMetaObject *smeta = sender->metaObject();
const char *signal_arg = signal;
++signal; //skip code
int signal_index = smeta->indexOfSignal(signal);
if (signal_index < ) {
// check for normalized signatures
tmp_signal_name = QMetaObject::normalizedSignature(signal - );
signal = tmp_signal_name.constData() + ; signal_index = smeta->indexOfSignal(signal);
if (signal_index < ) {
err_method_notfound(sender, signal_arg, "connect");
err_info_about_objects("connect", sender, receiver);
return false;
}
} QByteArray tmp_method_name;
int membcode = extract_code(method); if (!check_method_code(membcode, receiver, method, "connect"))
return false;
const char *method_arg = method;
++method; // skip code const QMetaObject *rmeta = receiver->metaObject();
int method_index = -;
switch (membcode) {
case QSLOT_CODE:
method_index = rmeta->indexOfSlot(method);
break;
case QSIGNAL_CODE:
method_index = rmeta->indexOfSignal(method);
break;
}
if (method_index < ) {
// 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 < ) {
err_method_notfound(receiver, method_arg, "connect");
err_info_about_objects("connect", sender, receiver);
return false;
}
if (!QMetaObject::checkConnectArgs(signal, method)) {
qWarning("QObject::connect: Incompatible sender/receiver arguments"
"\n %s::%s --> %s::%s",
sender->metaObject()->className(), signal,
receiver->metaObject()->className(), method);
return false;
} int *types = ;
if ((type == Qt::QueuedConnection || type == Qt::BlockingQueuedConnection)
&& !(types = queuedConnectionTypes(smeta->method(signal_index).parameterTypes())))
return false; QMetaObject::connect(sender, signal_index, receiver, method_index, type, types);
const_cast<QObject*>(sender)->connectNotify(signal - );
return true;
}

Signal & Slot in Qt的更多相关文章

  1. QT窗体间传值总结之Signal&Slot

    在写程序时,难免会碰到多窗体之间进行传值的问题.依照自己的理解,我把多窗体传值的可以使用的方法归纳如下: 1.使用QT中的Signal&Slot机制进行传值: 2.使用全局变量: 3.使用pu ...

  2. 详解 Qt 线程间共享数据(使用signal/slot传递数据,线程间传递信号会立刻返回,但也可通过connect改变)

    使用共享内存.即使用一个两个线程都能够共享的变量(如全局变量),这样两个线程都能够访问和修改该变量,从而达到共享数据的目的. Qt 线程间共享数据是本文介绍的内容,多的不说,先来啃内容.Qt线程间共享 ...

  3. QT 中 关键字讲解(emit,signal,slot)

    Qt中的类库有接近一半是从基类QObject上继承下来,信号与反应槽(signals/slot)机制就是用来在QObject类或其子类间通讯的方法.作为一种通用的处理机制,信号与反应槽非常灵活,可以携 ...

  4. signal & slot

    The Qt signals/slots and property system are based on the ability to introspect the objects at runti ...

  5. Qt_深入了解信号槽(signal&slot)

    转自豆子空间 信号槽机制是Qt编程的基础.通过信号槽,能够使Qt各组件在不知道对方的情形下能够相互通讯.这就将类之间的关系做了最大程度的解耦. 槽函数和普通的C++成员函数没有很大的区别.它们也可以使 ...

  6. QML于C++交互之信号与槽(signal&slot )

    connect c++ SIGNAL with QML SLOT 简介 QML 与 C++ 混合编程时,总结了一下qml和c++互相直接调用.及信号与槽连接 的几种情况,详细使用情况看示例代码 所有的 ...

  7. Object::connect: No such slot (QT槽丢失问题)

    1.看看你的类声明中有没有Q_OBJECT,并继承public QMainWindow{ 例如: class CPlot: public QMainWindow{ Q_OBJECT 2.你声明的函数要 ...

  8. qt的signal和slot机制

    signal和slot是QT中的一大特点 signal/slot是Qt对象以及其派生类对象之间的一种高效通信接口 用户可以将N多个信号和单个槽相连接, 或者将将N个槽和单个信号连接, 甚至是一个信号和 ...

  9. MFC、WTL、WPF、wxWidgets、Qt、GTK、Cocoa、VCL 各有什么特点?

    WTL都算不上什么Framework,就是利用泛型特性对Win API做了层封装,设计思路也没摆脱MFC的影响,实际上用泛型做UI Framework也只能算是一次行为艺术,这个思路下继续发展就会变得 ...

随机推荐

  1. jQuery 获取元素当前位置offset()与position()

    <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8& ...

  2. Ubuntu 16.04防火墙

    防火墙(ufw) 说明:简单版本的防火墙,底层依赖于iptables. 安装:sudo apt-get install ufw 查看状态:sudo ufw status 开启/关闭:sudo ufw ...

  3. TP5 隐藏入口文件 index.php

    找到public下的.htaccess <IfModule mod_rewrite.c> Options +FollowSymlinks -Multiviews RewriteEngine ...

  4. 数据库主键ID生成策略

    前言: 系统唯一ID是我们在设计一个系统的时候常常会遇见的问题,下面介绍一些常见的ID生成策略. Sequence ID UUID GUID COMB Snowflake 最开始的自增ID为了实现分库 ...

  5. 安装Ubunutu音频视频库

    sudo apt-get install ubuntu-restricted-extras

  6. scrapyd远程连接配置

    安装scrapyd: pip install scrapyd 默认scrapyd启动是通过scrapyd就可以直接启动,bind绑定的ip地址是127.0.0.1端口是:6800,这里为了其他主机可以 ...

  7. 我爱Markdown (1)

    作为一个程序员,用Word, Excel等写技术文档实在是不那么方便.而我,作为一个Unix/Linux程序员,写技术文档还是喜欢用Wiki等在线写作工具.虽然Wiki已经很酷了,但跟Markdown ...

  8. 开发一个 Windows 级别的操作系统难度有多大?

    在搜索进程相关问题的时候,无意间看到了知乎上面的这个问题,这也是困惑我的问题,只是自己比较懒,没有刨根问底,这次无意间看到了,并且认真看了大神的回答,很受启发,作为记录,贴于此,与各位分享: 来源:知 ...

  9. 一道百度的java面试题的几种解法

    考试结束,班级平均分只拿到了年级第二,班主任于是问道:大家都知道世界第一高峰珠穆朗玛峰,有人知道世界第二高峰是什么吗?正当班主任要继续发话,只听到角落默默想起来一个声音:”乔戈里峰” 前言 文章出自: ...

  10. 使用 Angular 和 RxJS 实现的无限滚动加载

    无限滚动加载应该是怎样的? 无限滚动加载列表在用户将页面滚动到指定位置后会异步加载数据.这是避免寻主动加载(每次都需要用户去点击)的好方法,而且它能真正保持应用的性能.同时它还是降低带宽和增强用户体验 ...