当我尝试连接BASE类信号时,Qt告诉我DERIVED类上不存在信号.
这是为什么?如何告诉connect使用BASE类?
namespace MyNamespace
{
void register(Derived* derived)
{
// ERROR MSG
// QObject::connect: No such signal MyNamespace::Derived::baseSignal()
QObject::connect( derived, SIGNAL(baseSignal()),
foo, SLOT(fooSlot()));
}
class Base : public QObject
{
Q_OBJECT
signals:
void baseSignal();
};
class Derived : public QObject,
public Base
{
Q_OBJECT
signals:
void derivedSignal();
};
} // namespace MyNamespace
Run Code Online (Sandbox Code Playgroud)
你的问题是,你乘获得Derived来自QObject:你从它直接产生,并通过Base类.不要这样做,因为Qt不支持多个派生QObject,甚至不支持虚拟派生.
系统QObject忽略第二个和后续的基数QObject.因此,对于QObject机器来说,这个Derived阶级只是来自QObject而不是来自Base- 因此它不知道baseSignal.他们应该是这样,因为多次QObject派生的支持会导致运行时开销 - 无论如何,你需要实际上继承QObject,而你甚至都没有这样做!
至少,如果您希望这样做,您的代码需要如下所示:
class Base : public virtual QObject { ... };
class Derived : public Base, public QObject { ... };
Run Code Online (Sandbox Code Playgroud)
......但Qt不支持这一点.
如果您编写Derived类以首先继承基类,那么您会更幸运:
class Base : public QObject { ... };
class Derived : public Base, public QObject { ... };
Run Code Online (Sandbox Code Playgroud)
虽然第二个QObject基地毫无意义并被QObject机器忽视,但这本来是有效的.
| 归档时间: |
|
| 查看次数: |
2512 次 |
| 最近记录: |