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信號不能實現多態嗎?同名信號(父類的信號子類是否繼承了)?因為根據我這個解決方案還是有點疑惑。。。還請大佬解答。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM