是否可以使用“this”从派生对象的基类发出信号

时间:2012-03-22 02:27:22

标签: qt inheritance signals-slots

不太清楚如何制定我的问题,我希望这更清楚。我想要一个看起来像这样的基类:

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 *)?

3 个答案:

答案 0 :(得分:2)

moc在编译时根据您在使用Q_OBJECT宏的类中声明它们的方式生成插槽和信号的列表。
此列表是字符串列表,因此如果您声明:

signals:
     void test(Base*);

列表中的项目是字符串"test(Base*)"(您可以在输出目录中的文件qt_meta_YourClass的变量moc_yourclass.cpp中看到该列表)。
SIGNALSLOT也返回字符串,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 *)。