不太清楚如何制定我的问题,我希望这更清楚。我想要一个看起来像这样的基类:
class Base : public QObject {
Q_OBJECT
void doSomething() { emit test(this); }
virtual void doSomethingElse() = 0;
signals:
void test(Base*);
}
然后在派生类中执行此操作:
class Derived : public Base {
void doSomethingElse() { emit test(this); }
}
如果我现在听这个对象的信号,我是否听取测试(Derived *)或/和测试(Base *)?
答案 0 :(得分:2)
moc在编译时根据您在使用Q_OBJECT
宏的类中声明它们的方式生成插槽和信号的列表。
此列表是字符串列表,因此如果您声明:
signals:
void test(Base*);
列表中的项目是字符串"test(Base*)"
(您可以在输出目录中的文件qt_meta_YourClass
的变量moc_yourclass.cpp
中看到该列表)。
宏SIGNAL
和SLOT
也返回字符串,connect()
将它们封装起来,使它们的格式与moc生成列表中的格式相同,并将它们与该列表中的格式进行比较。
当您派生类时,字符串没有更改,因此您仍然必须使用SIGNAL(test(Base*))
。
答案 1 :(得分:1)
您不应将发件人包含为信号参数。您只需使用QObject::sender()
即可获取已发送信号的QObject
。
例如:
emit test();
然后在一个插槽中:
void Listener::someObject_test() {
QObject* sender = QObject::sender();
// or:
Derived* sender = (Derived*)QObject::sender();
}
答案 2 :(得分:0)
由于派生类没有自己的信号,您将听取测试(Base *)。