繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM