【问题标题】:setChecked radiobutton of another group pyqt另一组pyqt的setChecked单选按钮
【发布时间】:2022-01-01 18:22:16
【问题描述】:

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

    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

我想让它不可能选择 dtype 单选按钮组的 complex 选项和库单选按钮的 tensorflow 单选按钮。在 4 种可能的组合中留下 3 种。所以如果我选择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 上激活并选择tensorflow,单选按钮将变为real(我想要的!)但tensorflow没有被选中!我需要再次选择它,就好像制作 self.real_dtype_rb.setChecked(True) 会取消对我单击的单选按钮的选择。 (如果你问我,这很奇怪)。


  • 使用hasattr 是因为根据我调用的顺序 函数,之前会创建一些单选按钮 另一个,所以它可能不存在。

  • This 是我正在考虑的一个选项,但它正在禁用单选按钮 组而不是改变他们的状态(不是我喜欢的)。

【问题讨论】:

  • 你可以在开始时使用self.cvnn_library_rb = None,然后你不需要hasattr(self, 'cvnn_library_rb')而是if self.cvnn_library_rb:

标签: python qt pyqt


【解决方案1】:

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

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

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

【讨论】:

  • 成功了!谢谢!
猜你喜欢
  • 2016-11-10
  • 1970-01-01
  • 1970-01-01
  • 2018-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-23
  • 2013-01-25
相关资源
最近更新 更多