Skip to content

联动下拉框

联动下拉框

遇到这样一个需求,有很多下拉框中,每次某个下拉框改变的时候,都会重新利用这些下拉框进行名字重新生成。这个很简单,我只需要给一个QT的信号槽机制,即各个下拉框都是同一个触发函数。

但是后来又需要一些限制条件。比如:下拉框一如果选择A,那么下拉框二必然要是10,反之亦然。这个如果对各个下拉框都单独写一个触发函数,也很轻松完成。比如下拉框一的触发函数中需要检查是否是A,然后改变;下拉框二则是另一个触发函数。

但是这样很乱,没法统一管理限制条件,此外每个下拉框都给一个触发函数,非常的丑。于是设置统一管理函数,即原来统一的触发函数中一开始进行检查:

问题就是检查限制条件函数怎么写,一开始就想着判断就好呗:如果下拉框一是A,下拉框二改为10;如果下拉框二是10,下拉框改为A。但是这遇到了一个类似死锁一样的问题。假如我现在是【A,10】的组合了,我想改为B,结果在限制条件函数中它会发现【下拉框二是10】,这样又改成了A,此时永远都无法修改为其他的选项了。

所以就需要给一个参数:这一次修改的是哪一个下拉框,然后检查函数中会检查。如上一个逻辑,将【A,10】中下拉框一改成B时,检查函数不会有【发现下拉框二是10,下拉框一改成了A】,因为他会在这个判断下检查这次是下拉框二修改的吗,发现不是就跳过这个检查了。给修改的哪个下拉框就是上图打码的部分:

可以看到我写了一个 set_newidx 这个子函数,里面还是有一些细节的。除了如果是限制值则另一个下拉框要对应修改;还有:不是限制值则要另一个下拉框的原来对应的值也修改掉,但如果另一个下拉框不是原来对应值,那么不要修改。即限制是【A,10】时,当前组合也是【A,10】时,如果从A改成B,那么就要把10也改变,防止出现【B,10】这种错误;原来是【B,20】,如果从B改成C,则不需要把20改掉,即最后为【C,20】。

Comments