Qt:从文本连接信号和插槽

时间:2014-10-06 01:06:02

标签: c++ qt signals signals-slots slot

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

获取正确的对象名称不是问题,因为我可以轻松地遍历数组并将名称与文件中的位置进行比较,但必须有某种方式可以返回信号并从文件中插入并在connect函数中使用它,如:

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

其中rtn函数返回对象名称/信号/插槽," line"是文件中的当前QString行。

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

注意: 这是一个简单的示例,演示本质上这个问题是如何存在的。

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

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

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

修改 除非,是否能够像这样连接?

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

因为我发现我的代码会像那样编译,但每当我尝试插入插槽或信号名称时,我只会收到如下错误:

  

QObject :: connect:使用SIGNAL宏绑定Tile :: clicked

1 个答案:

答案 0 :(得分:7)

使用以下静态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

现在,可以找到指向任何对象的指针,以便以有效的方式进行连接。

下一步是从相应的QMetaMethod对象获取发送方信号和接收方槽的QMetaObject个对象。使用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);
}