考虑接收信号信号管理器,检查一些条件下,并且如果它们满足,发送信号给时隙,否则丢弃信号:地图信号通过为可变的参数数目观察者时隙
信号(一些参数列表) - > [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,让我想一想!请参阅编辑以了解我试图达到的最终目标。关于你的例子中的东西 - 函数返回后QByteArray被销毁? – 2013-04-30 16:28:21
在控件进入“something”函数之前,''QByteArray''在其constData()结束后立即超出范围。当“something”执行时,它从悬挂指针读取数据。 – 2013-04-30 22:23:53
函数退出后不会超出范围吗?我把一些测试例子模拟这里的问题(输出) - http://pastebin.com/8QKFpQ6P,我使用http://www.compileonline.com/compile_cpp_online.php执行它,它看起来像临时工的析构函数被称为函数返回后是合乎逻辑的?或者,我误解了什么? – 2013-04-30 23:08:38