blu*_*kin 11 qt dynamic signals-slots
我正在尝试动态创建插槽并连接它们.我能够动态创建pushButtons并将它们与现有插槽连接.但是,如果我有一个具有一些成员函数的类,并且我想将这些函数用作插槽,该怎么办?
从一般的角度来看,我想创建一个模板,用于在给定函数指针的情况下生成槽.这允许我们在不改变现有代码的情况下创建插槽,而不必使用MOC重新编译.如果这没有意义,请告诉我.谢谢.
-简历
and*_*ref 11
它确实很有意义.我认为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;
};
Run Code Online (Sandbox Code Playgroud)
为要封装的每个函数创建一个并forward像往常一样连接.
现在,如果他们确实有争论,也许这篇Qt季刊文章可能会有所帮助.
该技术涉及qt_metacall自己重新实现该方法.该方法具有以下签名:
int QObject::qt_metacall(QMetaObject::Call call, int id, void **arguments)
Run Code Online (Sandbox Code Playgroud)
调用是一种metacall:插槽,信号,属性读或写等.每个插槽都有一个id.参数在arguments数组中打包(按值或作为指针).阅读moc生成的代码是了解它如何工作的好方法.
有关原始函数签名的数据仅在编译期间可用,但在运行时解析插槽.由于这种不匹配,您需要将函数包装到模板适配器类型中,该类型为您的实现提供一个常量接口qt_metacall,并将arguments数组转换为函数可以理解的内容(参见Python 解包操作符).Boost.Signals做了那种模板hackery.
| 归档时间: |
|
| 查看次数: |
5800 次 |
| 最近记录: |