8

Qt 中的信号/槽机制是一种静态机制。这些类必须由 moc 编译器进行预处理。
现在我想在运行时动态创建信号和槽。
我已经有了一个可行的解决方案,但对我来说感觉就像一个黑客,尽管我使用的是公开可用的方法。
这是动态插槽的代码:

bool DynamicQObject::connectDynamicSlot(const QString &objectName, QObject *pSourceObject, QMetaMethod signalMethod)
{
    QByteArray slotName = signalMethod.name().prepend("on").append("(");
    QStringList parameters;
    for (int i = 0, j = signalMethod.parameterCount(); i < j; ++i)
    {
        parameters << QMetaType::typeName(signalMethod.parameterType(i));
    }
    slotName.append(parameters.join(",")).append(")");
    QByteArray theSignal = QMetaObject::normalizedSignature(signalMethod.methodSignature().constData());
    QByteArray theSlot = QMetaObject::normalizedSignature(slotName);
    if (!QMetaObject::checkConnectArgs(theSignal, theSlot))
    {
        return false;
    }

    int signalId = pSourceObject->metaObject()->indexOfSignal(theSignal);
    if (signalId < 0)
    {
        return false;
    }

    int slotId = slotIndices.value(theSlot, -1);
    if (slotId < 0)
    {
        slotId = slotList.size();
        slotIndices[theSlot] = slotId;
        slotList.append(createSlot(theSlot, objectName, signalMethod));
    }

    return QMetaObject::connect(pSourceObject, signalId, this, slotId + metaObject()->methodCount());
}

如您所见,我大量使用了 QMetaObject,尤其是槽的索引(方法计数)。
动态信号的代码是可比较的。

现在我的问题是:这个解决方案的未来证明如何,特别是因为我假设索引必须至少比 methodCount() 大一个?

4

2 回答 2

2

现在我的问题是:这个解决方案的未来证明如何,特别是因为我假设索引必须至少比 methodCount() 大一个?

它现在应该可以工作。

至于未来的证据……可能。该片段正在使用不受支持的功能,这意味着这些功能可能会在未来的任何时候中断。尽管它可能会继续工作。

于 2013-09-07T22:50:39.770 回答
0

作为一个单独的选项,如果你所有的东西本质上都非常相似(比如向量或其他东西),请考虑连接到 lambda 函数。例如:

QObject::connect(iter->checkbox, &QCheckBox::stateChanged,
                [&, iter->startup_status](int new_val) {
                    if (new_val == Qt::CheckState::Checked) {
                        startup_status = true;
                    } else {
                        startup_status = false;
                    }
                });

iter具有公共字段的结构/类在哪里

QCheckBox *checkbox;
bool startup_status;

通过这种方法,可以有可变数量的非常相似的“槽”(它们实际上不是槽,而是像槽一样)

于 2021-05-21T17:09:48.667 回答