gpt4 book ai didi

c++ - 如何在不使用 QT5 中的 lambda 的情况下将带有 int 参数的信号连接到带有枚举参数的插槽?

转载 作者:行者123 更新时间:2023-11-30 05:34:17 26 4
gpt4 key购买 nike

我正在尝试连接信号 currentIndexChanged(int)来自 QComboBox到我类接收枚举的插槽,例如 Foo::mySlot(EnumFoo) .

我知道所有这些方法都行不通:

  1. connect(cb, &QComboBox::currentIndexChanged, foo, &Foo::mySlot);
  2. connect(cb, static_cast<void (QComboBox::*)(EnumFoo)>(&QComboBox::currentIndexChanged), foo, &Foo::mySlot);
  3. connect(cb, &QComboBox::currentIndexChanged, foo, static_cast<void (Foo::*)(int)>(&Foo::mySlot));

因为在 C/C++ 中,int从不隐式转换为枚举类型。相反的是,我想如果我的信号有一个枚举参数,我可以毫无问题地将它连接到一个带有 int 参数的插槽。

我知道如何使用 lambda 函数解决这个问题:

connect(cb, &QComboBox::currentIndexChanged, [=](int i){ foo.mySlot(static_cast<EnumFoo>(i)); });

没有 lambda 函数有什么办法可以解决这个问题吗?

编辑:使用我提出的解决方案,我以这种方式连接 Foo::mySlot。

LambdaWrapper *lw = new LambdaWrapper;
lw->connect(cb, static_cast<void(QComboBox::*)(int)>(&QComboBox::currentIndexChanged), [=](int i){ foo.mySlot(static_cast<EnumFoo>(i)); }, foo);

而且我不必再担心断开连接的问题了。只需管理 lw生命周期。

最佳答案

使用一个接受 int 并直接调用另一个槽函数的中间槽。

class Foo : public QObject
{
Q_OBJECT:

public slots:
void IndexChanged(int intParam);
void mySlot(EnumFoo fooType);
};

void Foo::IndexChanged(int index);
{
EnumFoo fooType = <static_cast<EnumFoo>(index);
mySlot(fooType);
}

connect(cb, &QComboBox::currentIndexChanged, foo, &Foo::IndexChanged);

关于c++ - 如何在不使用 QT5 中的 lambda 的情况下将带有 int 参数的信号连接到带有枚举参数的插槽?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34311988/

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