【问题标题】:pyQT Combobox print output upon changed更改后的 pyQT Combobox 打印输出
【发布时间】:2018-06-12 19:20:30
【问题描述】:

我想根据哪个组合框和组合框中的哪一行创建一个事件(在本例中为打印)。我看了这个old post 并做了一些扩展。有没有道理?当我在左侧组合框中按“秒”时,我想要输出“0, 2”,当我在右侧组合框中按“秒”时,我想要输出“1, 2”。

from PyQt4 import QtCore, QtGui
import sys


class MyClass(object):
    def __init__(self, arg):
        super(MyClass, self).__init__()
        self.row = arg
        self.col = []

    def add_column(self, col):
        self.col.append(col)


class myWindow(QtGui.QWidget):
    def __init__(self, parent=None):
        super(myWindow, self).__init__(parent)
        comboBox = [None, None]
        myObject = [None, None]
        slotLambda = [None, None]
        for j in range(2):
            comboBox[j] = QtGui.QComboBox(self)
            if j > 0:
                comboBox[j].move(100, 0)
            test = [['first', 1], ['second', 2]]
            myObject[j] = MyClass(j)
            for num, value in test:
                comboBox[j].addItem(num)
                myObject[j].add_column(value)
                slotLambda[j] = lambda: self.indexChanged_lambda(myObject[j])
            comboBox[j].currentIndexChanged.connect(slotLambda[j])

    @QtCore.pyqtSlot(str)
    def indexChanged_lambda(self, string):
        print string.row, string.col

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    app.setApplicationName('myApp')
    dialog = myWindow()
    dialog.show()
    sys.exit(app.exec_())

【问题讨论】:

    标签: python pyqt pyqt4 qcombobox


    【解决方案1】:

    如果使用QComboBox,则不需要使用lambda函数发送附加信息,QComboBox可以存储每个索引的信息,addItem()有一个附加参数可以保存信息,我们可以通过itemData() 方法,我们可以用setItemData() 方法添加其他信息。

    要知道QComboBox发出了我们可以使用sender()的信号,这个方法返回发出信号的对象。

    以上所有内容都在以下示例中实现:

    from PyQt4 import QtCore, QtGui
    import sys
    
    class myWindow(QtGui.QWidget):
        def __init__(self, parent=None):
            super(myWindow, self).__init__(parent)
    
            lay = QtGui.QHBoxLayout(self)
            test = [['first', 1], ['second', 2]]
    
            for j in range(5):
                comboBox = QtGui.QComboBox(self)
                lay.addWidget(comboBox)
                for i, values in enumerate(test):
                    text, data = values
                    comboBox.addItem(text, (j, data))
                comboBox.currentIndexChanged.connect(self.onCurrentIndexChanged)
    
        @QtCore.pyqtSlot(int)
        def onCurrentIndexChanged(self, ix):
            combo = self.sender()
            row, column = combo.itemData(ix)
            print(row, column)
    
    
    if __name__ == "__main__":
        app = QtGui.QApplication(sys.argv)
        app.setApplicationName('myApp')
        dialog = myWindow()
        dialog.show()
        sys.exit(app.exec_())
    

    【讨论】:

    • 非常感谢!起初我在row, column = combo.itemData(ix) 上得到了TypeError: 'QVariant' object is not iterable,但后来我在行上添加了.toPyObject(),问题就解决了。
    猜你喜欢
    • 2020-09-04
    • 1970-01-01
    • 1970-01-01
    • 2019-01-23
    • 1970-01-01
    • 2014-11-04
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多