Обновление PyQt QLabel при переключении QRadioButton, связанного с QComboBox

У меня есть QPixmap в QLabel, который изменяется в зависимости от выбора QComboBox. Например, в комбинированном ящике может быть выбор фруктов (например, "яблоко", "апельсин", "банан"). Если я выберу "яблоко", в QLabel появится изображение яблока. Кроме того, я хочу, чтобы изображение яблока изменилось на "специальное" изображение яблока в зависимости от того, переключена ли кнопка QRadioButton. Как только я выключу переключатель, изображение должно вернуться к стандартному изображению яблока. В настоящее время у меня он частично функционален: если радиокнопка включена до включения опции комбинированного списка, изображение отображается по желанию; если, однако, я выберу переключатель "вкл" после выбора опции со списком, отображается только стандартное изображение. Точно так же, если у меня есть специальное изображение, отображаемое и отключаем переключатель, изображение не возвращается к стандартному изображению.

Я предполагаю, что это как-то связано с методом "toggled()", но не уверен, как это реализовать.

self.fruit_list = ['apple', 'orange', 'banana']

self.fruit_combo = QtGui.QComboBox()
self.fruit_combo.addItems(self.fruit_list)

self.btn = QtGui.QRadioButton("btn")

self.fruit_image = QtGui.QLabel(self)
self.grid.addWidget(self.fruit_image, 1, 1) 
self.fruit_combo.currentIndexChanged[str].connect(lambda: 
                  self.image_update(self.fruit_combo, self.fruit_image, self.btn)

def image_update(self, qcombobox, qlabel, btn):
    image_path ="c :/images"
    current_item = str(qcombobox.currentText())
    if btn.isChecked():
       current_image = '%s/%s_special.jpg' %(image_path, current_item)
    else:
       current_image = '%s/%s.jpg' %(image_path, current_item)
    qlabel.setPixmap(QtGui.QPixmap(current_image))

Спасибо

1 ответ

Решение

@zachn, вы правы, проблема касается переключателя - более конкретно, это переключаемый сигнал, к которому вам нужно подключиться: http://doc.qt.io/qt-5/qabstractbutton.html

Попробуйте сделать это:

import partial
self.btn.toggled.connect(partial (self.image_update, self.fruit_combo, self.fruit_lbl, self.btn))

РЕДАКТИРОВАТЬ: для @furas, вот пример кода, где я не использовал изображения, только текст, чтобы показать изменения в QLabel. Обратите внимание, что я сохранил имя метода image_update(), хотя это должно быть text_update(). (Я кодировал это в Qt5, если используется в Qt4, замените QtWidgets на QtGui)

class SomeFrame(object):
    def __init__(self):
        # Assets
        fruit_list = ['apple', 'orange', 'banana']

        # Creating content 
        self.frame = QtWidgets.QFrame()
        self.fruit_combo = QtWidgets.QComboBox()
        self.fruit_combo.addItems(fruit_list)
        self.btn = QtWidgets.QRadioButton("btn")

        self.fruit_lbl = QtWidgets.QLabel()

        # Creating Layout
        layout = QtWidgets.QHBoxLayout()
        layout.addWidget(self.fruit_lbl)
        layout.addWidget(self.btn)
        layout.addWidget(self.fruit_combo)
        self.frame.setLayout(layout)

        # Initialize text in fruit_lbl
        self.image_update(self.fruit_combo, self.fruit_lbl, self.btn)
        self.frame.show()

        # Connections
        self.fruit_combo.currentIndexChanged[str].connect(lambda: self.image_update(self.fruit_combo, self.fruit_lbl, self.btn))
        self.btn.toggled.connect(partial (self.image_update, self.fruit_combo, self.fruit_lbl, self.btn))

    def image_update(self, qcombobox, qlabel, btn):
        current_item = str(qcombobox.currentText())
        if btn.isChecked():
            new_text = 'CHECKED: %s' % current_item
        else:
            new_text = 'UNCHECKED: %s' % current_item
        qlabel.setText(new_text)

if __name__ == "__main__":
    from PyQt5 import QtWidgets
    import sys
    from functools import partial

    app = QtWidgets.QApplication(sys.argv)         
    theFrame = SomeFrame()
    sys.exit(app.exec_())
Другие вопросы по тегам