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

  • 相关阅读:
    python分布式爬虫-Selenium(针对需要渲染的页面)
    《PHP高性能开发:基础、框架与项目实战》_王甲临
    flutter hello world
    C#+EF+SQLite数据库操作
    【转】Wilcoxon 检验之 rank-sum 与 signed-rank
    [转]多目标进化算法的性能指标总结 (一)
    IDEA查找栏
    [转]IDEA空指针断点
    Java 高斯分布随机数
    【Vegas原创】centos中挖矿病毒kdevtmpfsi的终极解决方法
  • 原文地址:https://www.cnblogs.com/xupeidong/p/13863276.html
Copyright © 2011-2022 走看看