2013-04-29 16 views
1

考虑接收信号信号管理器,检查一些条件下,并且如果它们满足,发送信号给时隙,否则丢弃信号:地图信号通过为可变的参数数目观察者时隙

信号(一些参数列表) - > [manager] ---> slot(一些参数)

我可以使用QMetaObject :: invokeMethod为每个给定的参数集实现它,例如void signal(int)和void slot(int ):

.h

class Manager: public QObject 
{ 
    Q_OBJECT 
public: 
    Manager(QObject* sender,const char* signal, QObject* recv, const char* slot); 
private: 
    bool isOkToSend(); 

    QString slotInvokeSyntax; 
    QObject *recv; 

private slots: 
    On_Signal(int); 
} 

的.cpp

Manager::Manager(QObject* sender,const char* signal, QObject* recvIn, const char* slot) 
     : slotInvokeSyntax(slot) 
     , recv(recvIn) 
{ 
    connect(sender,signal,this,SLOT(On_Signal(int)); 
    //retrieving method name only 
    slotInvokeSyntax.remove(0,1).remove(QRegExp("(*",Qt::CaseSensitive,QRegExp::Wildcard)); 
} 

Manager::On_Signal(int val) 
{ 
    //invoking slot 
    if(isOkToSend()) 
     QMetaObject::invokeMethod(recv,slotInvokeSyntax.toAscii().constData(),Q_ARG(int,val)); 
} 

我想以某种概括本作的信号和槽与通用号码/类型的参数 - 使管理者可以在任何对像信号(QString的)-Slot(QString的),信号(int,int)-slot(int,int),...

有没有任何方法可以在Manager中为每个参数类型添加插槽的情况下实现此功能?如果我的方法一般错误,欢迎就如何实施这样的经理提出任何建议!

编辑

澄清什么我想实现的一点 - 我有一个由许多小部件(或子系统)的几种可能的状态大系统(某些子系统还可以充当既可以作为独立的应用程序,也可以作为较大系统的一部分)。我试图实现拦截某些UI事件的全局观察器(例如按钮点击,QLineEdit中的编辑,QDropbox更改等),并且可以调用相应的窗口小部件,或者在需要的操作干扰时丢弃它系统的全局状态。我想通过截取信号来做到这一点,因为它允许避免系统组件之间的依赖关系,并将每个子系统编译为独立库(观察者不依赖于系统的任何其他部分,因此被放入核心库),但是我愿意接受任何其他替代方案,以使我能够实现这一目标!

回答

1

仅供参考,只要你使用这样的:

QString foo; 
something(foo.toAscii().constData()); 

...你是因为数据指向的 QByteArray::constData的有效期在 QByteArray实例的生活和不被修改访问已经被释放的内存。在你的情况下, QByteArray是通过调用 foo.toAscii()创建的临时文件,在 something被调用之前被销毁。所以这会在某个时候崩溃。 编辑:这不适用于函数调用,请参阅评论。

对于你的问题 - 知道你想要在这里实现什么会很有趣。 Qt的metatype和metaobject系统确实是一个丰富的系统,但是滥用它太多可能不是解决你的问题的最优雅的方式。也就是说,用这种“创造性”的方式在模拟对象,单元测试等中使用它可能很好。

我自己没有这样做,我不确定是否可以不用触摸​​,但它看起来像QObject generic signal handler包含您的问题的答案。

编辑后:

你说你正在寻找一个东西像一个普通的事件总线;所谓的原因是为了避免单个组件发生变化时的过度重建。我不会在这个架构中引入一个中央拦截器。如果通态量相当小,为什么不让一些信号在进入特定状态时发出信号,并通过启用/禁用各个组件对所有组件做出反应?

+0

感谢您的链接 - +1,让我想一想!请参阅编辑以了解我试图达到的最终目标。关于你的例子中的东西 - 函数返回后QByteArray被销毁? – 2013-04-30 16:28:21

+0

在控件进入“something”函数之前,''QByteArray''在其constData()结束后立即超出范围。当“something”执行时,它从悬挂指针读取数据。 – 2013-04-30 22:23:53

+0

函数退出后不会超出范围吗?我把一些测试例子模拟这里的问题(输出) - http://pastebin.com/8QKFpQ6P,我使用http://www.compileonline.com/compile_cpp_online.php执行它,它看起来像临时工的析构函数被称为函数返回后是合乎逻辑的?或者,我误解了什么? – 2013-04-30 23:08:38