zoukankan      html  css  js  c++  java
  • 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信号不能实现多态吗?同名信号(父类的信号子类是否继承了)?因为根据我这个解决方案还是有点疑惑。。。还请大佬解答。

  • 相关阅读:
    一些集群操作以及问题查询
    .a 文件 和 so 文件
    KNN算法
    opendir函数和readdir函数内涵及用法
    tps 和 qps的区别
    Git使用(积累一些常用的命令)
    MurmurHash
    HyperLogLog
    MySQL主从不生效且无错误
    正则表达式与SQL
  • 原文地址:https://www.cnblogs.com/xupeidong/p/13863276.html
Copyright © 2011-2022 走看看