当切换与 QComboBox 关联的 QRadioButton 时更新 PyQt QLabel
Updating a PyQt QLabel when a QRadioButton associated with a QComboBox is toggled
我在 QLabel 中有一个 QPixmap,它根据 QComboBox 选择而改变。例如,组合框可能有一系列水果(例如,'apple'、'orange'、'banana')。如果我选择 'apple' 苹果图像显示在 QLabel 中。我还希望苹果的图像根据 QRadioButton 是否被切换而更改为苹果的 "special" 图像。取消切换单选按钮后,图像应恢复为标准苹果图像。目前我有它的部分功能:如果在选择组合框选项之前切换单选按钮 'on',则图像会根据需要显示;但是,如果我在选择组合框选项后切换单选按钮 'on',则只显示标准图像。同样,如果我显示特殊图像并取消切换单选按钮,图像不会恢复为标准图像。
我认为这与 "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))
谢谢
@zachn,你是对的,问题是关于切换的——更具体地说,它是你需要连接到的切换信号: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))
编辑:@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_())
我在 QLabel 中有一个 QPixmap,它根据 QComboBox 选择而改变。例如,组合框可能有一系列水果(例如,'apple'、'orange'、'banana')。如果我选择 'apple' 苹果图像显示在 QLabel 中。我还希望苹果的图像根据 QRadioButton 是否被切换而更改为苹果的 "special" 图像。取消切换单选按钮后,图像应恢复为标准苹果图像。目前我有它的部分功能:如果在选择组合框选项之前切换单选按钮 'on',则图像会根据需要显示;但是,如果我在选择组合框选项后切换单选按钮 'on',则只显示标准图像。同样,如果我显示特殊图像并取消切换单选按钮,图像不会恢复为标准图像。
我认为这与 "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))
谢谢
@zachn,你是对的,问题是关于切换的——更具体地说,它是你需要连接到的切换信号: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))
编辑:@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_())