Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Qt:从文本连接信号和插槽_C++_Qt_Signals_Signals Slots_Slot - Fatal编程技术网

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

C++ Qt:从文本连接信号和插槽,c++,qt,signals,signals-slots,slot,C++,Qt,Signals,Signals Slots,Slot,当对象名称、信号和插槽都在文本文件中指定时,如何连接2个对象的信号和插槽 获取正确的对象名称不是问题,因为我可以轻松地循环一个数组,并将名称与文件中的位置进行比较,但必须有某种方式可以从文件返回信号和插槽,并在connect函数中使用它,如: connect(rtnObj1(line),SIGNAL(rtnSignal(line)),rtnObj2(line),SLOT(rtnSlot(line))); 其中rtn函数返回对象名/信号/插槽,“line”是文件中的当前QString行 我所知道

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

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

connect(rtnObj1(line),SIGNAL(rtnSignal(line)),rtnObj2(line),SLOT(rtnSlot(line)));
其中rtn函数返回对象名/信号/插槽,“line”是文件中的当前QString行

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

注意: 下面是一个简单的例子,从本质上说明了这个问题是如何存在的

第1帧: 4个QCOMBOX。第一个和第三个保存对象名称,第二个保存信号,第四个保存插槽。当然,每个项目都是这些列表中的一个Q字符串。点击按钮会在文件中追加一行,写入从每个框中选择的文本

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

根据文件中的数据创建对象很容易,但是如何从文件中创建/提取信号和插槽呢

编辑: 除非,一个人能像这样连接吗

connect(objectA, "", objectB, "");
因为我刚刚发现我的代码将像这样编译,但是每当我尝试放入插槽或信号名时,我只会得到如下错误:

QObject::connect:使用信号宏绑定磁贴::单击


您的问题可以通过以下静态方法之一轻松解决:

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


如果您正在查找示例代码,您可能会同时查看这两个PyQt绑定。是的!非常感谢你!这正是我要找的!我知道必须有某种方法来做到这一点,因为连接发生在运行时而不是编译时。感谢您抽出时间来介绍这个例子。现在一切正常。int index=emitter->metaObject()->indexOfSignal(QMetaObject::normalizedSignature(qPrintable(signalName));这里的“signalName”应该是“aSignal()”而不是“aSignal”?
QMetaObject::Connection QObject::connect(
    const QObject *sender, const QMetaMethod &signal,
    const QObject *receiver, const QMetaMethod &method,
    Qt::ConnectionType type = Qt::AutoConnection)
QHash<QString, QObject *> m_objects; // I use QObject as a generic example
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);
}