[英]Qt: connecting signals and slots from text
当对象名称,信号和插槽均在文本文件中指定时,如何连接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
使用以下静态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);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.