问题描述
pDeviceInstance = new Device()
pDeviceInstance->loadLibrary();
pDeviceInstance->Create(functionpointer)
出现异步事件并调用 functionpointer
(我想处理)。
functionpointer
和 pDeviceInstance
都是 static
。
我想从 functionpointer
内部发出 Qt 信号,但因为它是 static
,所以不可能发出信号。
我试过了:
-
使
functionpointer
成为一个 lambda,希望从 lambda 内部发出信号。 但要实现这一点,lambda 需要捕获this
, 并且为了让 lambda 衰减为函数指针,它无法捕获任何内容。 -
为了使
functionpointer
非static
但在这种情况下它似乎是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);
// ...
}