【问题标题】:Updating a PyQt QLabel when a QRadioButton associated with a QComboBox is toggled当切换与 QComboBox 关联的 QRadioButton 时更新 PyQt QLabel
【发布时间】:2017-06-11 07:52:54
【问题描述】:

我在 QLabel 中有一个 QPixmap,它根据 QComboBox 选择进行更改。例如,组合框可以选择水果(例如,'apple'、'orange'、'banana')。如果我选择“苹果”,则会在 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))

谢谢

【问题讨论】:

  • 创建最小的工作示例 - 这样每个人都可以运行它。
  • 啊,抱歉。试图最小化到仅相关的代码。

标签: python pyqt4 toggle qcombobox qradiobutton


【解决方案1】:

@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_())

【讨论】:

  • 好的,我对部分原因感到有些困惑,因为我以前没有使用过它们,只看到了“power”示例。
  • @zachn 在这部分代码partial 的作用类似于lambda
  • @zachn - 两次调用image_update() 是正确的。此函数检查两个小部件,然后更新图像/标签。
  • 这里是否有必要使用partial来提高可读性等,或者它的使用是微不足道的?
  • @zachn:一般来说,我喜欢在将信号连接到方法时使用部分与 lambda。我认为以这种方式更具可读性。您可以阅读其他差异:1) late/early binding 2) Execution/performance
猜你喜欢
  • 2017-08-11
  • 2011-08-20
  • 2012-12-21
  • 2017-06-03
  • 2017-04-01
  • 2017-10-22
  • 2011-02-10
  • 2017-10-24
  • 2016-10-12
相关资源
最近更新 更多