Python 在PyQt5中,如果您有多个复选框,如果没有选中某个复选框,但选中了任何复选框,如何指向函数?

Python 在PyQt5中,如果您有多个复选框,如果没有选中某个复选框,但选中了任何复选框,如何指向函数?,python,pyqt5,Python,Pyqt5,我有一个使用PyQt5开发的程序,其中有6个QComboxes可供选择,然后根据这些选择,您可以进一步缩小数据范围。为清楚起见,它看起来如下所示: 如果某些东西属于“弱点”类别,我希望用户可以选择将其从最终选择过程中删除,以防初始结果过于狭窄 问题就在这里: 最终计算基于选中的复选框。为了确保这在GUI中得到反映,每当更改组合框时,我都会执行以下操作: 将QStackedWidgets更改为“停用”标签 根据组合框中的类型数据确定优势和劣势 取消选中所有复选框,并将相应的复选框标记为选中 代码

我有一个使用PyQt5开发的程序,其中有6个QComboxes可供选择,然后根据这些选择,您可以进一步缩小数据范围。为清楚起见,它看起来如下所示:

如果某些东西属于“弱点”类别,我希望用户可以选择将其从最终选择过程中删除,以防初始结果过于狭窄

问题就在这里:

最终计算基于选中的复选框。为了确保这在GUI中得到反映,每当更改组合框时,我都会执行以下操作:

  • 将QStackedWidgets更改为“停用”标签
  • 根据组合框中的类型数据确定优势和劣势
  • 取消选中所有复选框,并将相应的复选框标记为选中
  • 代码如下:

            #deactivate all stacks
        for t in range(0,18):
            str_type0 = self.value[t].lower()[0:3]
            str_stack0 = 'self.str_'+str(str_type0)
            eval(str_stack0).setCurrentIndex(0)
    
            weak_type0 = self.value[t].lower()[0:3]
            weak_stack0 = 'self.weak_'+str(weak_type0)
            eval(weak_stack0).setCurrentIndex(0)
    
    
        #strong loop
        for t in range(0,len(self.r)):
            str_type = self.value[self.r[t]].lower()[0:3]
            str_stack = 'self.str_'+str(str_type)
            eval(str_stack).setCurrentIndex(1)
    
        #weak loop
        for t in range(0,len(self.q)):
            weak_type = self.value[self.q[t]].lower()[0:3]
            weak_stack = 'self.weak_'+str(weak_type)
            eval(weak_stack).setCurrentIndex(1)
    
        #set all checkboxes as checked if currently shown in stack
        for t in range(0,18):
            checkstr0= self.value[t].lower()[0:3]
            checkstr1='self.weak_'+str(checkstr0)+'_act'
            eval(checkstr1).setChecked(False)
    
            weak_stack1 = 'self.weak_'+str(checkstr0)
            weak_stack1 = eval(weak_stack1)
            if weak_stack1.currentIndex() == 1:
                eval(checkstr1).setChecked(True)
            else: continue
    
    这很好,即使它有点笨重也能工作(目标是让它工作,然后让它以后高效地工作)。问题在于,更改复选框会触发执行所有结果计算的函数,但由于多个复选框同时更改,甚至只更改一个复选框,因此会多次触发此函数。这是对计算的巨大浪费

    我想到了一些解决办法。我认为解决这个问题的最好方法可能是运行函数,而不是在任何特定复选框更改时运行,而是在发生更改时运行。比如: 如果有(checkbox.checkState()==已更改):执行某些操作。 我不确定这是否是一个好的解决方案,或者如何做到这一点


    欢迎提出任何意见。提前谢谢

    在我继续思考问题的同时,我找到了答案。问题是每次更改时它都会发出信号,这在程序自行配置时是一个可怕的数量

    显而易见但简单的解决方案是将复选框从:

    复选框.stateChanged.connect(函数) 到 复选框。按下。连接(功能)

    这样,复选框信号只有在我在程序中实际按下时才会发出。希望这将能够帮助任何其他人谁在未来遇到同样的问题