Как получить доступ к текущим данным QComboBox внутри QTreeWidget

#python #pyqt4 #pyside #signals-slots #qcombobox

#python #pyqt4 #pyside #сигналы-слоты #qcombobox

Вопрос:

Я использую PySide для этого. Кажется, я не могу получить доступ к текущему тексту в поле со списком, встроенном в древовидный виджет. Что я могу получить, так это текущий текст из последнего созданного поля со списком. Одно замечание, в моей основной программе эти поля со списком будут генерироваться динамически, поэтому их не будет заданного количества. Таким образом, нет способа установить уникальный идентификатор.

 import sys
from PySide import QtCore
from PySide import QtGui

class Example(QtGui.QMainWindow):    
    def __init__(self):
        super(Example, self).__init__()
        self.di = {"name":["Bill", "Dan", "Steve"], "age":["45","21","78"]}        
        self.initUI()
        self.populateTree()

    def initUI(self):
        self.tree = QtGui.QTreeWidget()
        self.tree.setColumnCount(1)
        self.setCentralWidget(self.tree)
        self.setGeometry(300, 300, 350, 250)
        self.setWindowTitle('Main window')    
        self.show()

    def populateTree(self):
        # Add widget item to tree
        for key, value in self.di.iteritems():
            item1 = QtGui.QTreeWidgetItem()
            item1.setText(0, key)
            item1.setExpanded(True)
            self.tree.addTopLevelItem(item1)
            # Add Combo Box to widget item
            item2 = QtGui.QTreeWidgetItem(item1)
            combo = QtGui.QComboBox(self.tree)
            combo.addItems(value)
            self.tree.setItemWidget(item2, 0, combo)
            combo.currentIndexChanged.connect(lambda: self.doSomething(combo.currentText()))

    def doSomething(self, n):
        print n            

def main():    
    app = QtGui.QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()
  

Ответ №1:

Кэшируйте текущий экземпляр, используя аргумент по умолчанию:

 combo.currentIndexChanged.connect(
    lambda index, combo=combo: self.doSomething(combo.currentText()))
  

Комментарии:

1. У меня есть следующий вопрос. Если бы я использовал виджет QLineEdit, как бы это работало? Я знаю, что currentIndexChanged принимает аргумент index. Но returnPressed для QLineEdit, похоже, не принимает никаких аргументов.

2. Я понял это:

3. line.returnPressed.connect(lambda line=line: self.doSomething(line.text()))

4. @Berkyjay. index Необходим для того, currentIndexChanged чтобы остановить combo перезапись аргумента. В общем, вам нужно указывать аргументы только в том случае, если сигнал отправляет их. Если вы сомневаетесь, вы можете просто использовать, например lambda *args, widget=widget: ... , который должен работать во всех случаях.