1. 程式人生 > 實用技巧 >QT父類訊號呼叫子類槽函式

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