【发布时间】:2018-11-28 20:55:44
【问题描述】:
我问自己以下代码是否安全:
#include <QCoreApplication>
#include <QObject>
#include <QDebug>
#include <QTimer>
class Base : public QObject
{
Q_OBJECT
public:
Base()
{
// is it safe to do that ?
connect(this, SIGNAL(signal1()), this, SLOT(slot1()));
}
virtual ~Base() {}
signals:
void signal1();
public slots:
virtual void slot1() = 0; // could be only virtual
};
class Derived : public Base
{
Q_OBJECT
public slots:
virtual void slot1()
{
qDebug() << "derived slot";
}
void emitSignal1()
{
emit signal1();
}
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Derived d;
QTimer::singleShot(0, &d, SLOT(emitSignal1()));
return a.exec();
}
#include "main.moc"
输出如预期:
derived slot
我没有看connect方法在幕后做了什么,但我猜它就像设置一个回调函数。
如果Base 类构造函数中没有调用虚方法,那么到目前为止我没有看到任何副作用,但这是真的吗?
谢谢。
【问题讨论】:
-
这应该没问题,只要您坚持使用“旧式”连接语法(使用
SIGNAL和SLOT)。使用函数指针的 Qt5 版本将无法使用。 -
您能否解释一下为什么它在新的连接语法中“不起作用”?因为@eyllanesc 的回答建议使用它。
-
我记得不久前尝试这样做时遇到了编译器错误。但是使用我当前的编译器确实可以工作。所以是的,@eyllanesc 的回答是正确的。只要您的编译器接受在构造函数中使用纯虚拟成员,它就可以工作 - 因此您应该确实使用新语法。