故事背景:我定义了一个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信号不能实现多态吗?同名信号(父类的信号子类是否继承了)?因为根据我这个解决方案还是有点疑惑。。。还请大佬解答。