虚拟Qt信号? 复习一些QT C++代码时,我发现: class Foo { Q_OBJECT signals: virtual void someSignal(const QString& str, int n) { Q_UNUSED(str); Q_UNUSED(n); } ... };
现在,Qt信号不能有一个主体,所以我很惊讶这甚至可以编译(可能是因为主体实际上是空的)。我也不认为把信号虚拟化有什么意义。。。它不能有一个主体,那么它怎么能被覆盖呢虚拟Qt信号? 复习一些QT C++代码时,我发现: class Foo { Q_OBJECT signals: virtual void someSignal(const QString& str, int n) { Q_UNUSED(str); Q_UNUSED(n); } ... };,c++,qt,C++,Qt,现在,Qt信号不能有一个主体,所以我很惊讶这甚至可以编译(可能是因为主体实际上是空的)。我也不认为把信号虚拟化有什么意义。。。它不能有一个主体,那么它怎么能被覆盖呢 我是否遗漏了一些东西,或者这是一种有效的代码气味?在我看来很难闻 在基类中声明一个信号,然后从派生类发出它是有效的,例如 class MyBase : public QObject { Q_OBJECT // ... signals: void somethingHappened(); }; class MyDer
我是否遗漏了一些东西,或者这是一种有效的代码气味?在我看来很难闻 在基类中声明一个信号,然后从派生类发出它是有效的,例如
class MyBase : public QObject
{
Q_OBJECT
// ...
signals:
void somethingHappened();
};
class MyDerived : public MyBase
{
Q_OBJECT
// ...
void doSomething();
};
void MyDerived::doSomething()
{
// ....
emit somethingHappened();
}
这也许就是问题中声明的意思。
< P>严格的C++,它编译正常,给出了<代码>信号<代码>是一个宏,用于<代码>保护< /代码>,<代码> QuununUn>代码>是一个强制转换为<代码>无效>代码>。但是,在运行
moc
时,您应该会遇到一个错误,它精确地创建了声明为信号的方法的实现。Qt信号不允许是(纯)虚拟的。请参阅对此错误的评论-TL;DR:我不知道代码的作用是什么,但它是错误的(不仅仅是气味不对,它表面上是无效的)。信号实施总是由主运行中心生成。应移除信号主体
错误:不是信号声明。Soclassx{Q_信号void s(){}
触发它,但是类X{Q_SIGNAL void s();};void X::s(){}
不会
b) moc不允许在非从QObject
派生的类中使用Q\u对象
宏,诊断错误:类包含Q\u对象宏,但不从QObject继承
QObject
派生的信号没有任何意义,让我们假设代码实际上如下所示:
class Foo : public QObject
{
Q_OBJECT
signals:
virtual void someSignal(const QString&, int);
};
void Foo::someSignal(const QString& str, int n)
{
Q_UNUSED(str);
Q_UNUSED(n);
}
这将通过moc并编译,但不会链接。链接器将对Foo::someSignal
的多个声明发出诊断。此文件中有一个定义,moc生成的源文件中有另一个定义它可以编译,但仍然是ODR冲突:该函数有两个主体,一个在头中,一个在moc发出的cpp中。