C++ 启用/禁用QComboBox/QSpinBox时,如何停止QComboBox/QSpinBox发出信号?

C++ 启用/禁用QComboBox/QSpinBox时,如何停止QComboBox/QSpinBox发出信号?,c++,qt,C++,Qt,我有一个小的Qt绘图应用程序,我正在基于“主”组合框启用/禁用小部件(组合框/旋转框)。例如,假设主机是combo1,它根据currentIndex(),更改combo2中的条目,启用/禁用spin1,并在选择combo1中的某个条目时设置spin1的值。不过,有更多的小部件,而不仅仅是这些 在(及以后)中的小讨论之后,我对每个connect()使用了Qt::QueuedConnection,但这并没有阻止重新启用的小部件在重新启用时发出信号。这导致我的manyconnect()对所有重新启用的

我有一个小的Qt绘图应用程序,我正在基于“主”组合框启用/禁用小部件(组合框/旋转框)。例如,假设主机是
combo1
,它根据
currentIndex()
,更改
combo2
中的条目,启用/禁用
spin1
,并在选择
combo1
中的某个条目时设置
spin1
的值。不过,有更多的小部件,而不仅仅是这些

在(及以后)中的小讨论之后,我对每个
connect()
使用了
Qt::QueuedConnection
,但这并没有阻止重新启用的小部件在重新启用时发出信号。这导致我的many
connect()
对所有重新启用的小部件都执行,导致多个绘图,这是我想要避免的。现在,几乎所有的小部件都在
connect()
中使用
plot()
,因此一个插槽中有多个信号


我的问题是:有没有办法防止在重新启用小部件时发出信号?我可以让
plot()
使用一些
bool
来检查绘图是否已执行,并阻止相同类型的进一步操作,但这仍然会导致小部件发出信号并运行
plot()
,即使检查将阻止实际的绘图,但这似乎不是一种方法。我还希望避免运行
installEventFilter()
或类似程序,因为这很可能会比以前的修复程序更慢。

在每次连接之前使用断开连接以防止多个连接。始终允许断开未连接插槽的连接

disconnect(spinbox1,...);
connect(spinbox1,...);
阻塞信号也是可能的,但我认为您需要第一种解决方案

从QT文档:

bool QObject::块信号(bool块)
如果block为true,则此对象发出的信号将被阻止(即,发出信号将不会调用任何连接到它的东西)。如果block为false,则不会发生此类阻塞。

在每次连接之前使用disconnect以防止多个连接。始终允许断开未连接插槽的连接

disconnect(spinbox1,...);
connect(spinbox1,...);
阻塞信号也是可能的,但我认为您需要第一种解决方案

从QT文档:

bool QObject::块信号(bool块)
如果block为true,则此对象发出的信号将被阻止(即,发出信号将不会调用任何连接到它的东西)。如果block为false,则不会发生此类阻塞。

中已经提到的另一个选项是使用:


我发现它更容易使用和阅读。此外,在许多情况下,您根本不知道/处理连接。

中已经提到的另一个选项是使用:


我发现它更容易使用和阅读。此外,在许多情况下,您根本不知道/处理连接。

也许这有帮助:@Trevir是的,这很有帮助。但是我必须为
QSpinBox
选择
editingFinished()
,为
QComboBox
选择
activated(int)
。如果你能回答这个问题,我会记下来。很高兴,这很有帮助,但我不会因为别人的工作而受到表扬;-)。也许这有帮助:@Trevir是的,这有帮助。但是我必须为
QSpinBox
选择
editingFinished()
,为
QComboBox
选择
activated(int)
。如果你能回答这个问题,我会记下来。很高兴,这很有帮助,但我不会因为别人的工作而受到表扬;-)。这也是一个解决方案,它可能会很好地竞争
editingFinished()
activated()
,因为我现在看到,当它按预期运行时,即使在旋转框或绘图区域中单击,也会导致信号发出。我以前看到过
blockSignals()
,但在这里似乎没有帮助。如果没有其他答案,我将标记这一个,以及Trevir的评论。这也是一个解决方案,它可能会很好地推动
editingFinished()
activated()
,因为我现在看到,虽然它按预期运行,但即使在旋转框或绘图区域中单击,也会导致信号发出。我以前看到过
blockSignals()
,但在这里似乎没有帮助。如果没有其他答案,我会记下这个,还有特雷维尔的评论。