2014-10-06 131 views
2

当对象名称,信号和插槽全部在文本文件中指定时,如何连接2个对象的信号和插槽?Qt:连接来自文本的信号和插槽

获取正确的对象名称不是问题,因为我可以轻松地遍历数组并将名称与文件中的点名进行比较,但是必须有某种方法可以返回信号并且从文件插槽,并用它在连接功能,如:

connect(rtnObj1(line),SIGNAL(rtnSignal(line)),rtnObj2(line),SLOT(rtnSlot(line))); 

其中RTN函数返回的对象名称/信号/槽,和“线”是从该文件的当前的QString线。

我知道的唯一方法是通过在每个组合中进行字面编码并将QStrings与if语句进行比较,但这会非常乏味,因为组合的数量会非常高。

注: 这里有一个简单的例子演示基本这个问题如何存在。

第1帧: 4 QComboBoxes。第一和第三保持对象名称,第二保持信号,第四保持槽。每个项目当然是这些列表中的一个QString。点击一个按钮将新行添加到文件中,写入从每个框中选择的文本。

第2帧:已经有必需的对象。读取文件时,它会将列表中定义的对象与已创建的对象相匹配,并按照文件描述将它们连接起来。

基于文件所保存的数据很容易创建对象,但是如何从文件创建/拉取信号和插槽?

编辑: 除非,是否能够这样连接?

connect(objectA, "", objectB, ""); 

因为我刚刚发现我的代码可以编译这样的,但是每当我试图把在插槽或信号名称我得到这样一个错误:

的QObject ::连接:使用在SIGNAL宏绑定瓷砖::点击

回答

6

你的问题是与下面的静态QObject::connect()方法的一个容易解决:

QMetaObject::Connection QObject::connect(
    const QObject *sender, const QMetaMethod &signal, 
    const QObject *receiver, const QMetaMethod &method, 
    Qt::ConnectionType type = Qt::AutoConnection) 

首先,您需要指向发送者和接收者对象的指针。有几种方法可以存储对象池。我建议把所有对象QHash:现在

QHash<QString, QObject *> m_objects; // I use QObject as a generic example 

,这是有可能找到一个指向任何对象以高效的方式连接。

下一步将从对应的QMetaObject对象获取发送者信号和接收者插槽的对象QMetaMethod。使用QObject::metaObject()QMetaObject实例。

下面是其中只使用字符串参数连接两个对象的函数的完整代码:

void dynamicConnect(const QString &senderName, const QString &signalName, 
        const QString &receiverName, const QString &slotName) 
{ 
    QObject *emitter = m_objects.value(senderName); 
    int index = emitter->metaObject() 
      ->indexOfSignal(QMetaObject::normalizedSignature(qPrintable(signalName))); 
    if (index == -1) { 
     qWarning("Wrong signal name!"); 
     return; 
    } 
    QMetaMethod signal = emitter->metaObject()->method(index); 

    QObject *receiver = m_objects.value(receiverName); 
    index = receiver->metaObject() 
      ->indexOfSlot(QMetaObject::normalizedSignature(qPrintable(slotName))); 
    if (index == -1) { 
     qWarning("Wrong slot name!"); 
     return; 
    } 
    QMetaMethod slot = receiver->metaObject()->method(index); 

    QObject::connect(emitter, signal, receiver, slot); 
} 
+0

如果你正在寻找的示例代码,你很可能看到两个PyQt的绑定。 – o11c 2014-10-06 03:33:41

+0

是的!非常感谢!这正是我所期待的!我知道必须有某种方式来做这件事,因为连接发生在运行时而不是编译时。感谢您抽出时间来加入这个例子。现在一切正常。 – Yattabyte 2014-10-07 00:32:16