gpt4 book ai didi

c++ - Qt 中禁用的小部件上的阻塞信号

转载 作者:搜寻专家 更新时间:2023-10-31 01:43:50 25 4
gpt4 key购买 nike

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

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

当小部件被禁用时(而不改变其 blockSignals 状态),我如何禁用它发送的信号?

编辑澄清一下:因为这是一个小部件,所以当它被禁用时用户无法与其交互,但是以编程方式更改小部件时会发出一些信号。就我而言,有两个有趣的信号:currentIndexChanged(int)activated(int)

我的代码中的问题是,我有时会以编程方式更改组合,并且我希望它发出信号,有时是用户通过交互来更改组合。这就是我使用 currentIndexChanged 而不是 activated 的原因。

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

最佳答案

QComboBox 信号是从最终用户的角度来看的用户交互,如果您只有一个 QComboBox 而没有其他问题似乎暗示的话。

我根本无法重现该问题。我刚刚制作了一个简短的程序,因为我不能简单地与小部件交互,所以我无法获得任何 QComboBox 信号。

编辑:为临时读者提供更多上下文更新您的问题可能是个好主意,但根据评论中的进一步说明,是的,以编程方式可能是这种情况,但随后发出信号使用相应的插槽以编程方式处理也可能很有用,因此如果 Qt 自动阻止它们,这并不是一个重大改进。

幸运的是,您希望拥有的功能已经可用:

bool QObject::blockSignals(bool block)

If block is true, signals emitted by this object are blocked (i.e., emitting a signal will not invoke anything connected to it). If block is false, no such blocking will occur.

The return value is the previous value of signalsBlocked().

Note that the destroyed() signal will be emitted even if the signals for this object have been blocked.

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

inline bool disableAndBlockSignals(QWidget *widget)
{
widget->setDisabled(true);
return widget->blockSignals(true);
}

如果你只想禁用其中的一些,比如 currentIndexChanged,你可以使用 disconnect然后手动。

关于c++ - Qt 中禁用的小部件上的阻塞信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24445682/

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