#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: ...
, который должен работать во всех случаях.