class A : public QObject
{
Q_OBJECT
public:
A(QObject *parent);
~A();
signals:
void sigTest(QString strName);
public slots:
virtual void slotTest(QString strName); //父类的槽函数是一个虚函数
};
class B : public A
{
Q_OBJECT
public:
B(QObject* parent);
~B();
public slots:
virtual void slotTest(QString strName); //子类重写父类的槽函数
};
A::A(QObject *parent)
: QObject(parent)
{
connect(this, &A::sigTest, this, &A::slotTest); //连接信号槽
//在父类的构造函数中发射信号,因为是直连方式连接的所以相当于直接调用
//直接调用在父类没有构造好之前会直接调用父类的虚函数,C++的多态不会生效
emit sigTest("A::A");
}
A::~A()
{
}
void A::slotTest(QString strName)
{
qDebug() << "A slot" << strName;
}
B::B(QObject *parent)
: A(parent)
{
}
B::~B()
{
}
void B::slotTest(QString strName)
{
qDebug() << "B slot" << strName;
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
B b(&a);
emit b.sigTest("main");
return a.exec();
}
输出
A slot "A::A"
B slot "main"
可以将连接方式改为Qt::QueuedConnection,也没这个问题