QT父类信号调用子类槽函数

故事背景:我定义了一个QT父类,里面有自定义信号和槽函数,我在main函数定义父类指针指向子类对象,此时发信号,子类收不到,开始咱们的探险之路。。。

 

解决方案:根据加断点发现调用的是父类的信号,但是信号槽是在子类构造函数做的关联;此时把connect放在父类就可以了(这只是一种解决方案);另一种是在网上查看了父类调用子类方法dynamic_cast,下面用代码解释下我的两种解决方案

 

代码有话说:

一、先看下父类和子类的头文件

#ifndef MYPARENT_H
#define MYPARENT_H

#include <QObject>

class myParent : public QObject
{
    Q_OBJECT
public:
    explicit myParent(QObject *parent = nullptr);

signals:
    void sig_test();
public slots:
    virtual void slot_test();
};

class myChild : public myParent
{
    Q_OBJECT
public:
    explicit myChild(myParent *parent = nullptr);
    void connect_slot();
signals:
    void sig_test();
public slots:
    void slot_test();
};
#endif // MYPARENT_H

第一种解决方案,connect放在父类构造函数:

#include "myparent.h"
#include <QDebug>
myParent::myParent(QObject *parent) : QObject(parent)
{
    connect(this, &myParent::sig_test, this, &myParent::slot_test);
}

void myParent::slot_test()
{
    qDebug() << "this is parent";
}

myChild::myChild(myParent *parent) : myParent(parent)
{
    //connect(this, &myChild::sig_test, this, &myChild::slot_test);
    //emit sig_test();
}

void myChild::connect_slot()
{
    //connect(this, &myChild::sig_test, this, &myChild::slot_test);
    //emit sig_test();
}

void myChild::slot_test()
{
    qDebug() << "this is child";
}


//调用方法

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
//std::unique_ptr<myParent> test = std::unique_ptr<myParent>(new myChild);
//dynamic_cast<myChild *>(test.get())->connect_slot();
//test->connect_slot();
myParent *test = new myChild;
emit test->sig_test();
//emit dynamic_cast<myChild *>(test)->sig_test();
}

此时打印:this is child

第二种解决方案,使用dynamic_cast转换为子类对象,然后把connect放在子类的构造函数中

#include "myparent.h"
#include <QDebug>
myParent::myParent(QObject *parent) : QObject(parent)
{
    //connect(this, &myParent::sig_test, this, &myParent::slot_test);
}

void myParent::slot_test()
{
    qDebug() << "this is parent";
}

myChild::myChild(myParent *parent) : myParent(parent)
{
    connect(this, &myChild::sig_test, this, &myChild::slot_test);
    //emit sig_test();
}

void myChild::connect_slot()
{
    //connect(this, &myChild::sig_test, this, &myChild::slot_test);
    //emit sig_test();
}

void myChild::slot_test()
{
    qDebug() << "this is child";
}

//调用方法

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
std::unique_ptr<myParent> test = std::unique_ptr<myParent>(new myChild);
//dynamic_cast<myChild *>(test.get())->connect_slot();
//test->connect_slot();
//myParent *test = new myChild;
//emit test->sig_test();
emit dynamic_cast<myChild *>(test.get())->sig_test();
}

 

 

这是在开发中遇到的问题,分享给大家,如果有什么更好的解决方案或者此类问题,欢迎大家分享和评论。

 

Question:QT信号不能实现多态吗?同名信号(父类的信号子类是否继承了)?因为根据我这个解决方案还是有点疑惑。。。还请大佬解答。

posted @ 2020-10-23 11:42  徐沛东  阅读(3863)  评论(0编辑  收藏  举报