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. 可以修改类不用重启Tomcat加载整个项目

    修改类不重启Tomcat(不用手动重启) 修改tomcat  conf目录下的server.xml <Context path="/struts2" docBase=&quo ...

  2. Python and Bluetooth

    环境 Windows7-64bit + Python2.7.15-64bit + Pybluez 安装pybluez时会报错,处理方法~ 1.安装VCForPython27.msi,这是为了提供vis ...

  3. 完全国人自主研发原创的智能软件路由器BDS即将发布,附带企业服务总线ESB功能

    完全国人自主研发原创的智能软件路由器即将发布: 完全国人自主研发原创的智能软件路由器BDS即将发布,附带企业服务总线ESB功能 智能软件路由器 BDS 简要介绍 http://kan.weibo.co ...

  4. kafka多线程消费topic的问题

    案例: topic:my-topic,分区:6 消费者:部署三台机器,每台机器上面开启6个线程消费. 消费结果:只有一台机器可以正常消费,另外两台机器直接输出六条告警日志: No broker par ...

  5. 修改zend studio字体大小

    第一步:进入设置窗口    windows -> preferences第二步:进入修改字体的选项卡.    General -> Appearance -> Colors and ...

  6. the unchecked warnings

    5.1.9. Unchecked Conversion Let G name a generic type declaration with n type parameters. There is a ...

  7. CentOS6.4将MySQL5.1升级至5.5.36

    1.为了安全期间,首先需要备份原有数据 2.卸载原有MySQL,先停止原有的MySQL服务,再查找 find / -name mysql [root@qxyw /]# find / -name mys ...

  8. PHP之string之explode()函数使用

    explode (PHP 4, PHP 5, PHP 7) explode - Split a string by string explode - 使用一个字符串分割另一个字符串 Descripti ...

  9. background-position 详解

    一.语法 语法:background-position:x, y; 定义:背景图片相对容器原点的起始位置: 取值:     关键字:top | center | bottom | left | cen ...

  10. 数据库sqlite3在linux中的使用

    在linux下我们首先要获取root权限 当然也可是使用 sudo命令 接着让我们来安装sqlite3吧!博主当然是已经安装好了! 别急,的确你是安装好了sqlite3但是有一点必须要记住,你还没有安 ...