gpt4 book ai didi

c++ - Qt 元对象系统 : emit signal using a string with its name

转载 作者:太空宇宙 更新时间:2023-11-03 10:43:30 26 4
gpt4 key购买 nike

Qt 信号/槽系统很不错,但看起来它缺少一些真正有用的功能(或者至少我找不到如何使用它)。我有一个有很多信号的类(class),这个类(class)有一个 switch它需要根据变量的值发出适当的信号。现在我使用 C 预处理器解决这个问题:

#define CASE(_NAME) \    
case MyEnum_ ## _NAME: \
{ \
emit MySignal_ ## _NAME(); \
do_other_stuff(); \
break; \
}

switch(val)
{
CASE(Val_1)
CASE(Val_2)
CASE(Val_3)
}

这看起来不对劲。我相信有一种更优雅的方式。 QMetaObject有一个 indexOfSignal方法可以使用带有名称的字符串为我提供信号的 Qt 内部 ID。如果我可以使用此 ID 发出信号,我的代码将变得干净得多

我看过 moc 生成的信号方法实现,看起来一个信号与另一个信号唯一不同的是一个数字:

void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) };
QMetaObject::activate(this, &staticMetaObject, <signal_id>, _a);

哪里<signal_id>是每个信号唯一的整数。

所以,问题是,我如何 emit(int signalIdx) ?或者至少有机会调用QMetaObject::activate ,因为它看起来埋在私有(private)标题中?

最佳答案

使用 QMetaObject::invokeMethod

我在我的程序中使用这个:

mCaller 是定义槽的对象,mSlotName 是槽的名称

QMetaObject::invokeMethod(mCaller, mSlotName.toLatin1().constData(), Qt::DirectConnection)

关于c++ - Qt 元对象系统 : emit signal using a string with its name,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28763154/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com