【问题标题】:Static Signals in QTQT 中的静态信号
【发布时间】:2021-03-01 20:56:28
【问题描述】:

我正在寻找一种优雅的模式来跟踪类的所有实例的事件。所以理论上应该可以直接或在静态方法中从类中发出信号(当时似乎没有必要),因为:

connect() 方法声明了一个发送者和它的签名。在这种情况下,它可能是类。对发件人没有特定的期望。据我了解,信号本身是事件堆栈上的一个对象,面向发送者。生成的位置无关紧要(在静态或非静态上下文/方法中)。

一般来说:将信号声明为静态函数可能会出现什么问题,而不是期望对象发出信号,它是类的有效实例。

现在已经可以通过同一类的辅助实例(例如第一个实例)(可通过类中的静态公共指针引用)或澄清特定的辅助类实例。然后必须连接到那个静态指针,并通过它来听所有的。然后每个实例通过它间接发射

helperInstance->staticEmit(signalFoo,this);

所以问题是:是否有更直接/优雅的方式或者 QT 应该对此进行研究?

【问题讨论】:

  • 从你的问题中我不清楚你是否真的尝试过声明一个信号是静态的?
  • 好点,其实没试过,但正如moc中预期的那样:error: 'this' is available for static member functions QMetaObject::activate(this, &staticMetaObject, 0, _a);

标签: c++ qt


【解决方案1】:

理论上,Qt 可以实现此功能,基本上是为您向 moc 编译器显示的帮助对象代码添加代码生成。

因为任何信号都是函数声明,其实现由 moc 编译器生成。这个实现基本上只是一个:

for( auto& slot: connected_slots):
    slot.object->slot.function()

(非常简单)

这个connected_slots 需要住在某个地方。 IE。它是一个变量,需要存储在内存中。 所以在任何情况下,您都需要某种对象来存储它。这通常在QObject 基类中。

我猜测他们没有添加这个的原因是因为 Qt 框架非常面向对象,增加的复杂性超过了好处。

【讨论】:

  • 感谢您的许可,我已经预料到会发生这样的事情。而“需要住在某个地方”的问题困扰着我。强大的 OO 设计实际上是 QT 框架中最好的部分之一,但是一旦我进入 Java 中的实现细节,我就无法摆脱类对象的概念,它代表类本身。在 C++ 中使用命名空间将一个类的所有静态 props 放在一起是朝着这一目标迈出的第一步。
  • 嗯,除了OO是不是好东西,Qt就是OO,静态函数没那么多。所以它真的不适合。类对象的意义不就是代表类吗?或者你的意思是有一个元对象烘焙到java类中? (对我来说是很久以前的事了)
  • 是的,所有对象都有 .Class 引用,这对反射很有帮助。对于 VM,静态道具和方法需要存在于某个地方。我相信静态道具和方法可能非常符合 OO,但我们最常看到的是在使用静态时避免 OO 的模式,所以我猜它来自那里。我将坚持一审方法。但是由于这很容易,我相信我应该可以将信号声明为静态的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-13
  • 1970-01-01
  • 2013-06-13
  • 1970-01-01
  • 2017-02-23
  • 2017-07-18
  • 1970-01-01
相关资源
最近更新 更多