2017-01-25 8 views
2

QComboBoxの選択に基づいて変更されたQLabel内にQPixmapがあります。例えば、コンボボックスは、果物(例えば、「リンゴ」、「オレンジ」、「バナナ」)の選択を有することができる。私が「りんご」を選ぶと、リンゴのイメージがQLabelに表示されます。 QRadioButtonがトグルされているかどうかに応じて、リンゴのイメージをリンゴの「特別な」イメージに変更する必要があります。ラジオボタンを非表示にすると、イメージは標準のリンゴイメージに戻ります。現在、私はそれが部分的に機能しています:コンボボックスオプションを選択する前にラジオボタンがオンになっていると、イメージは必要に応じて表示されます。ただし、コンボボックスオプションを選択した後にラジオボタンをオンにすると、標準画像のみが表示されます。同様に、特別な画像を表示し、ラジオボタンをトグル解除すると、画像は標準画像に戻らない。QComboBoxに関連付けられたQRadioButtonが切り替えられたときにPyQt QLabelを更新する

これは "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)) 

おかげ

+0

最小限、作業例を作成する - そう誰もがそれを実行することができます。 – furas

+0

ああ、お詫び申し上げます。関連するコードのみを最小化しようとしていた。 – zachn

答えて

1

@zachn、あなたは、問題がより具体的なtoggled-懸念される正しい、それはあなたがに接続する必要がある切り替え信号:http://doc.qt.io/qt-5/qabstractbutton.html#toggled

これをやってみてください。

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

EDIT:ここでは、いくつかのサンプルコードがあります。ここではイメージを使用せず、QLabelの変更を示すテキストのみを使用しています。 text_update()にする必要があるにもかかわらず、メソッド名image_update()を保持していたことに注意してください。 (Qt4版で使用した場合、私はQtGuiとQtWidgetsを置き換え、Qt5でこれをコード化された)

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_()) 
+0

OK、私は少し前に私はそれらを使用していない部分的な原因と少し混乱しており、 "パワー"の例を見ただけです。 – zachn

+0

あなたはimage_update()を2回、コンボボックス接続を介して1回、ラジオボタンの接続を通してもう1回呼び出しているようです。 – zachn

+1

@zachnこの部分のコード 'partial'は' lambda'と似ています – furas

関連する問題