我有一个被禁用的组合,但是向其添加元素将发出currentIndexChanged(int)信号。

我希望禁用小部件时会自然关闭信号,但事实并非如此。我知道有blockSignals(bool),但是如果有许多小部件的信号必须“禁用时被阻止”,则blockSignals将要求每个小部件都具有 bool(boolean) 状态。

禁用小部件时如何禁用它发送的信号(并且不更改其blockSignals状态)?

编辑
需要说明的是:由于这是一个小部件,因此禁用后用户无法与其进行交互,但是以编程方式更改该小部件时会发出一些信号。就我而言,有两个有趣的信号:currentIndexChanged(int)activated(int)
我的代码中的问题是,我有时会以编程方式更改组合,并且希望它发出信号,有时是用户通过交互来更改组合。这就是为什么我使用currentIndexChanged而不是activated的原因。

无论如何,在两种情况下,我都不希望禁用小部件时发出信号。

最佳答案

如果您只有QComboBox,而您的问题似乎没有暗示,那么QComboBox信号是基于最终用户 Angular 用户交互。
我根本无法重现该问题。我刚刚编写了一个简短的程序,由于无法简单地与小部件进行交互,因此无法获取任何QComboBox信号。
编辑:为临时读者提供更多上下文来更新您的问题可能是一个好主意,但是基于注释的进一步澄清,是的,以编程方式可能是这种情况,但是信号也可能对以编程方式进行处理很有用,并带有相应的插槽,因此Qt自动阻止它们并不是主要的改进。
幸运的是,您希望拥有的功能已经可用:

如果要对许多小部件执行此操作,请创建一个简单的函数而不是myWidget->setDisabled(true);:

inline bool disableAndBlockSignals(QWidget *widget)
{
    widget->setDisabled(true);
    return widget->blockSignals(true);
}
如果只想禁用其中的一部分,例如currentIndexChanged,则可以手动使用disconnect

10-07 13:35
查看更多