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

标签 c++ qt

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

chat(及以后)中的小讨论之后,我将Qt::QueuedConnection与每个connect()一起使用,但这并没有阻止重新启用的小部件在重新启用后发出信号。这导致我的许多connect()都针对所有重新启用的窗口小部件执行,导致出现多个绘图,我想避免这些绘图。就像现在一样,(几乎)所有小部件都在plot()内使用connect(),因此在一个插槽中有多个信号。

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

最佳答案

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

disconnect(spinbox1,...);
connect(spinbox1,...);

阻塞信号也是可能的,但我认为您需要第一个解决方案。

从QtDocumentation:

bool(boolean) QObject::blockSignals( bool(boolean) 块)
如果block为true,则阻止此对象发出的信号(即,发出信号将不会调用与其连接的任何对象)。如果block为false,则不会发生这种阻塞。

关于c++ - 启用/禁用QComboBox/QSpinBox时如何停止发出信号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41460061/

相关文章:

c++ - Qt QOpenGLWidget glClearColor 无法正常运行

c++ - 将 QML 场景渲染成纹理并保存

linux - 可以从 Qt 运行程序但不能从 konsole 运行它

c++ - 这里虚拟运算符 ()() 的目的是什么?

c++ - 如何在 kdevelop 中修改项目的 CMakeList 文件

c++ - 解构固定长度二进制/alpha 消息的最快方法是什么?

c++ - 如何在Clion中使用虚拟环境从C++调用Python?

c++ - Windows 媒体基金会使用原始图像对视频进行编码

c++ - 在 C++ 中循环数组时访问结构属性

c++ - 将 .ui 文件链接到 C++