如何从函数指针内部发出 Qt 信号?

问题描述

在实现设备接口时,MyClass 构造函数中有如下代码

pDeviceInstance = new Device()
pDeviceInstance->loadLibrary();
pDeviceInstance->Create(functionpointer)

出现异步事件并调用 functionpointer(我想处理)。

functionpointerpDeviceInstance 都是 static。 我想从 functionpointer 内部发出 Qt 信号,但因为它是 static,所以不可能发出信号。

我试过了:

  1. 使 functionpointer 成为一个 lambda,希望从 lambda 内部发出信号。 但要实现这一点,lambda 需要捕获 this, 并且为了让 lambda 衰减为函数指针,它无法捕获任何内容

  2. 为了使 functionpointerstatic在这种情况下它似乎是 MyClass函数指针 这是不同的类型。

因此,在我从 functionpointer 内部发出 Qt 信号的计划中,我的选项用完了。 有什么我在这里遗漏的吗?

解决方法

完全没有问题。将 QObject 与您希望作为 qApp (QApplication::instance) 的孩子的信号挂钩,然后通过全局 qApp 指针使用它:

class MySignaler : public QObject {
  Q_OBJECT
public:
  MySignaler(QObject *parent = nullptr) : QObject(parent) {
    setParent(qApp);
  }
  Q_SIGNAL void deviceActivity();
  static bool emitDeviceActivity() {
    if (!qApp) return false;
    auto *self = qApp->findChild<MySignaler*>();
    if (!self) return false;
    emit self->deviceActivity();
    return true;
};

int main(int argc,char *argv[]) {
  QApplication app(argc,argv);
  MySignaler signaler;
  Device device;
  device.loadLibrary();
  device.create(&MySignaler::emitDeviceActivity);
  // ...
}