pyQt-QComboBox:在激活时获取上一个和新选择的项目

时间:2018-09-11 07:34:45

标签: python pyqt pyqt5 qcombobox

在我的程序中,一些组合框(QComboBox)用于进行多项设置。有时不仅要知道用户选择的项目,而且要知道组合框中先前选择的项目是必要的。 好吧,转移新选择非常容易:

self.MyCombobox.activated[str].connect(self.ComboChange)

但是,当索引更改时,如何不仅将新选择的项也将上一项传递给函数?

我的折衷解决方案是为每个组合框手动设置一个变量,该变量存储最后选择的值,以便在选择更改后可以访问它。但是考虑到我有很多组合框,在某些框可以用不同的方式更新之前,这很容易出错。

预先感谢您的帮助

一个最小的工作示例:

import sys

from PyQt5.QtWidgets import (   QApplication, QWidget, QGridLayout, QComboBox,
                                QLabel)

class BaseWidget(QWidget):
    def __init__(self):
        super(BaseWidget, self).__init__()
        self.setGeometry(300, 300, 300, 200)

        # 2 Labels to display the new and the old item after selection
        self.LabelOldItem = QLabel(self)
        self.LabelNewItem = QLabel(self)

        self.MyCombobox = QComboBox(self)
        self.MyCombobox.addItems(['Item 1', 'Item 2', 'Item 3', 'Item 4'])
        self.MyCombobox.activated[str].connect(self.ComboChange)


        grid = QGridLayout()
        grid.addWidget(self.MyCombobox, 0, 0, 1, 1)
        grid.addWidget(self.LabelOldItem, 1, 0, 1, 1)
        grid.addWidget(self.LabelNewItem, 2, 0, 1, 1)

        self.setLayout(grid)

    def ComboChange(self, newitem):
        self.LabelOldItem.setText('Previous Selection: ') # <- crucial point
        # How can i transfer both, not only the new item but also the previous
        # item of the combobox when it gets activated?
        self.LabelNewItem.setText('New Selection: <b>' + newitem + '</b>')


if __name__ == '__main__':

    app = QApplication(sys.argv)

    pyqtComboExample = BaseWidget()
    pyqtComboExample.show()
    sys.exit(app.exec_())

Minimal working example

1 个答案:

答案 0 :(得分:5)

可能的解决方案是创建自定义QComboBox:

var html = @"<html><body>" +
            "<h1>Test</h1>" +
            "<input/>" +        
            "</body></html>";

var htmlSource = new HtmlWebViewSource();
htmlSource.Html = html;

另一种可能的解决方案是使用import sys from PyQt5 import QtCore, QtWidgets class ComboBox(QtWidgets.QComboBox): new_signal = QtCore.pyqtSignal(str, str) def __init__(self, parent=None): super(ComboBox, self).__init__(parent) self.lastSelected = "" self.activated[str].connect(self.onActivated) def onActivated(self, text): self.new_signal.emit(self.lastSelected, text) self.lastSelected = text class BaseWidget(QtWidgets.QWidget): def __init__(self): super(BaseWidget, self).__init__() self.setGeometry(300, 300, 300, 200) # 2 Labels to display the new and the old item after selection self.LabelOldItem = QtWidgets.QLabel() self.LabelNewItem = QtWidgets.QLabel() self.MyCombobox = ComboBox() self.MyCombobox.addItems(['Item 1', 'Item 2', 'Item 3', 'Item 4']) self.MyCombobox.new_signal.connect(self.ComboChange) grid = QtWidgets.QGridLayout(self) grid.addWidget(self.MyCombobox, 0, 0, 1, 1) grid.addWidget(self.LabelOldItem, 1, 0, 1, 1) grid.addWidget(self.LabelNewItem, 2, 0, 1, 1) def ComboChange(self, lastitem, newitem): self.LabelOldItem.setText('Previous Selection: <b>{}</b>'.format(lastitem)) self.LabelNewItem.setText('New Selection: <b>{}</b>'.format(newitem)) if __name__ == '__main__': app = QtWidgets.QApplication(sys.argv) pyqtComboExample = BaseWidget() pyqtComboExample.show() sys.exit(app.exec_()) 来使用QComboBox,并将旧项保存在属性中:

sender()