Qt:将信号的参数向上转换到插槽

时间:2017-03-06 18:19:53

标签: c++ qt signals-slots upcasting

我有一个从子类获取的参数发出的信号,但是在一个插槽实现中,我不需要子类的特殊处理程序;只是父类。我认为connect()会改变那个参数,但不幸的是,我得到了:

QObject::connect: Incompatible sender/receiver arguments
        emitter::mysignal(messageSubclass *) --> slotter::generalHandler(messageSuperclass *)

emitter我有:

emit mysignal((messageSubclass *)msg_ptr );

代码中有各种各样的地方我需要专门处理这个messageSubclass。但是,在一个地方,只有一个插槽方法可以处理整个信号系列,所以我有:

connect(emitter_ptr, SIGNAL(mysignal(messageSubclass *)), this, SLOT(generalHandler(messageSuperclass *)));

我真的不想让几个特定处理程序替换generalHandler(),这些处理程序都做同样的事情。换句话说,我试图避免一些单调乏味的事情:

connect(emitter_ptr, SIGNAL(mysignal(messageSubclass *)), this, SLOT(specificHandler(messageSubclass *)));
connect(emitter_ptr, SIGNAL(mysignalA(messageSubclassA *)), this, SLOT(specificHandlerA(messageSubclassA *)));
connect(emitter_ptr, SIGNAL(mysignalB(messageSubclassB *)), this, SLOT(specificHandlerB(messageSubclassB *)));
connect(emitter_ptr, SIGNAL(mysignalC(messageSubclassC *)), this, SLOT(specificHandlerC(messageSubclassC *)));
...

void handlerClass::specificHandler(messageSubclass *msg_ptr) {
    generalHandler((messageSuperclass *)msg_ptr);
}

void handlerClass::specificHandlerA(messageSubclassA *msg_ptr) {
    generalHandler((messageSuperclass *)msg_ptr);
}

void handlerClass::specificHandlerB(messageSubclassB *msg_ptr) {
    generalHandler((messageSuperclass *)msg_ptr);
}

void handlerClass::specificHandlerC(messageSubclassC *msg_ptr) {
    generalHandler((messageSuperclass *)msg_ptr);
}

再次,我需要

signals:
    mysignal(messageSubclass *);

适用于需要messageSubclass的其他广告位。

我正在使用Qt 4.8

0 个答案:

没有答案