Настроенный радиобуттон другой группы pyqt

0

Вопрос

У меня есть 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

Я хочу сделать невозможным выбор complex опция группы радиокнопок dtype и tensorflow радиобуттон библиотечных радиобуттонов. Оставляя 3 из 4 возможных комбинаций. Поэтому, если я выберу 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 используется потому, что в зависимости от порядка, в котором я вызываю функции, некоторые радиокнопки будут созданы раньше других, поэтому их может не существовать.

  • Этот это вариант, который я рассматриваю, но он отключает группу radiobutton вместо изменения их состояния (не то, что я предпочитаю).

pyqt python qt
2021-11-23 08:48:26
1

Лучший ответ

1

Сигнал toggled срабатывает всякий раз, когда вы меняете состояние своих переключателей. Таким образом, он будет активирован, когда вы позвоните setChecked (один раз для переключателя, который вы переключаете, и один раз для другого, который вы отключаете) и update_image называется это неправильным случаем.

Вы должны проверить состояние переключателя и позвонить update_image только если переключатель включен:

rb2.toggled.connect(lambda state: state and self.update_image("library", rb2.text(), state))
2021-11-23 10:45:03

Это сработало! Спасибо!
Agustin Barrachina

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................