另一组pyqt的setChecked单选按钮

setChecked radiobutton of another group pyqt

我创建了 2 个单选按钮(在 QMainWindow class 内),例如:

    def dtype_radiobuttons(self):
        layout = QHBoxLayout()
        rb1 = QRadioButton("complex")
        rb1.toggled.connect(lambda: self.update_image("dtype", rb1.text()))


        self.real_dtype_rb = QRadioButton("real", self)
        self.real_dtype_rb.toggled.connect(lambda: self.update_image("dtype", self.real_dtype_rb.text()))

        self.btngroup.append(QButtonGroup())
        self.btngroup[-1].addButton(self.real_dtype_rb)
        self.btngroup[-1].addButton(rb1)

        rb1.setChecked(True)
        layout.addWidget(rb1)
        layout.addWidget(self.real_dtype_rb)
        layout.addStretch()

        return layout

    def library_radiobutton(self):
        layout = QHBoxLayout()
        self.cvnn_library_rb = QRadioButton("cvnn", self)
        self.cvnn_library_rb.toggled.connect(lambda: self.update_image("library", self.cvnn_library_rb.text()))

        rb2 = QRadioButton("tensorflow", self)
        rb2.toggled.connect(lambda: self.update_image("library", rb2.text()))

        self.btngroup.append(QButtonGroup())
        self.btngroup[-1].addButton(rb2)
        self.btngroup[-1].addButton(self.cvnn_library_rb)

        self.cvnn_library_rb.setChecked(True)
        layout.addWidget(self.cvnn_library_rb)
        layout.addWidget(rb2)
        layout.addStretch()

        return layout

我想不可能到selectdtype radiobuttons组的complex选项和库radiobuttons的tensorflowradiobutton .在 4 种可能的组合中留下 3 种。因此,如果我 select complex 并且库是 tensorflow,我想自动将库更改为 cvnn。我试着这样实现它:

    def update_image(self, key, value):
        if value == "complex":
            if hasattr(self, 'cvnn_library_rb'):    # It wont exists if I still didnt create the radiobutton.
                self.cvnn_library_rb.setChecked(True)   # Set library cvnn
        elif value == "tensorflow":
            if hasattr(self, 'real_dtype_rb'):
                self.real_dtype_rb.setChecked(True)   # Set real dtype
        ... Do the other stuff I need to do.

奇怪的是,它实际上在某种意义上起作用,例如,如果我处于 complex 激活和 select tensorflow,则单选按钮变为 real(我想要的!)但是 tensorflow 没有得到 selected!我需要再次 select 它,就好像使 self.real_dtype_rb.setChecked(True) 取消我单击的单选按钮的 selection 一样。 (如果你问我的话很奇怪)。


只要您更改单选按钮的状态,就会触发信号 toggled。因此,它会在您调用 setChecked 时触发(一次是您切换的单选按钮,一次是您取消切换的单选按钮)并且调用 update_image 错误的 案例。

您必须检查单选按钮的状态并仅在切换单选按钮时调用 update_image:

rb2.toggled.connect(lambda state: state and self.update_image("library", rb2.text(), state))