QT父類訊號呼叫子類槽函式
故事背景:我定義了一個QT父類,裡面有自定義訊號和槽函式,我在main函式定義父類指標指向子類物件,此時發訊號,子類收不到,開始咱們的探險之路。。。
解決方案:根據加斷點發現呼叫的是父類的訊號,但是訊號槽是在子類建構函式做的關聯;此時把connect放在父類就可以了(這只是一種解決方案);另一種是在網上查看了父類呼叫子類方法dynamic_cast,下面用程式碼解釋下我的兩種解決方案
程式碼有話說:
一、先看下父類和子類的標頭檔案
#ifndef MYPARENT_H #define MYPARENT_H #include <QObject> class myParent : publicQObject { 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訊號不能實現多型嗎?同名訊號(父類的訊號子類是否繼承了)?因為根據我這個解決方案還是有點疑惑。。。還請大佬解答。