当在文本文件中指定对象名称,信号和插槽时,如何连接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
答案 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);
}