故事背景:我定義了一個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信號不能實作多型嗎?同名信號(父類的信號子類是否繼承了)?因為根據我這個解決方案還是有點疑惑,,,還請大佬解答,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/187608.html
標籤:C++
