gpt4 book ai didi

qt - 在 Qt 中创建动态插槽

转载 作者:行者123 更新时间:2023-12-04 02:00:38 24 4
gpt4 key购买 nike

我正在尝试动态创建插槽并连接它们。我能够动态创建按钮并将它们与现有插槽连接起来。但是,如果我有一个包含一些成员函数的类,并且我想将这些函数用作插槽怎么办。

从一般的角度来看,我想创建一个模板来生成给定函数指针的插槽。这允许我们在不更改现有代码的情况下创建插槽,并且不必使用 MOC 重新编译。
如果这没有意义,请告诉我。谢谢你。

-简历

最佳答案

这确实很有意义。我假设 QSignalMapper 不是你想要的。如果你的函数没有参数,也许这样的事情就足够了:

class SlotForwarder : public QObject
{
Q_OBJECT

public:

typedef void (*Function)(); // or whatever. I never get this syntax right...

SlotForwarder(Function function, QObject* parent = 0)
: QObject(parent)
, m_fptr(function)
{}

public slots:

void forward()
{
m_fptr();
}

private:

Function m_fptr;
};

为每个要封装的函数创建一个并连接到 forward照常。

现在,如果他们确实有争论,也许这篇 Qt Quarterly 文章可能会有所帮助。

Dynamic Signals and Slots by Eskil A. Blomfeldt

该技术涉及重新实现 qt_metacall自己方法。该方法具有以下签名:
int QObject::qt_metacall(QMetaObject::Call call, int id, void **arguments)

调用 是一种元调用:槽、信号、属性读取或写入等。每个槽都有一个 编号 .参数在 中打包(按值或作为指针)论据 大批。阅读 moc 生成的代码是了解其工作原理的好方法。

有关原始函数签名的数据仅在编译时可用,但槽在运行时解析。由于这种不匹配,您需要将函数包装到模板适配器类型中,该类型为您的 qt_metacall 的实现提供一个常量接口(interface)。并转换 arguments将数组转换为函数可以理解的内容(参见 Python unpack 运算符)。 Boost.Signals做那种 template hackery .

关于qt - 在 Qt 中创建动态插槽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5719473/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com