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