我正在使用PySide在python中创建一个小应用程序。我从文本文件中读取行并在单独的QLineEdit Widget中显示每一行。每个“条目”有2行编辑和2个QPushButtons。对于每一行,我都添加了这些小部件。我的问题是我为QPushButtons设置了一个信号槽,但是当生成所有“条目”时,只有最后一个条目QPushButtons连接到槽。愿有人帮助我。
这是我的代码
class ItemLogger(QtGui.QMainWindow, Ui.Ui_MainWindow):
def __init__(self, parent = None):
super(ItemLogger, self).__init__(parent)
self.setupUi(self)
self.parseBossItem()
self.comboBox.currentIndexChanged.connect(self.parseBossItem)
self.increase.clicked.connect(self.add_subtract)
def add_subtract(self):
initial = 1
print "kajskasdjflsdkjflk"
def addRow(self, item):
self.frame = QtGui.QFrame()
self.layout = QtGui.QHBoxLayout()
self.itemName = QtGui.QLineEdit(item)
self.itemName.setReadOnly(True)
self.itemCount = QtGui.QLineEdit()
self.itemCount.setText("0")
self.itemCount.setMaximumWidth(40)
self.decrease = QtGui.QPushButton("-")
self.increase = QtGui.QPushButton("+")
self.layout.addWidget(self.itemName)
self.layout.addWidget(self.itemCount)
self.layout.addWidget(self.decrease)
self.layout.addWidget(self.increase)
self.frame.setLayout(self.layout)
self.verticalLayout_3.addWidget(self.frame)
def parseBossItem(self):
if self.comboBox.currentText() == "Item_1":
item_list = open("BossItems/Random_Item")
for line in item_list.readlines():
self.addRow(line)
if self.comboBox.currentText() == "Item_2":
item_list = open("BossItems/Random_Item_2")
for line in item_list.readlines():
self.addRow(line)
答案 0 :(得分:1)
这是因为您只连接了最后一个条目。
以下是您的实际操作:
self.decrease
,self.increase
。self.decrease
,self.increase
的值。self.increase
,现在是最后添加的小部件。如果您在创建小部件后不需要访问它们,则应考虑使用局部变量(例如,不使用self
)并在addRow
函数内连接信号。
如果您需要跟踪窗口小部件引用,则可以将它们添加到数组中:
# Somewhere in __init__ or in parseBossItem
self.increase = []
# in addRow
self.increase.append(QtGui.QPushButton("+"))
self.layout.addWidget(self.increase[-1])
self.increase[-1].clicked.connect(self.add_subtract)
# and so on...
要从不同的发件人使用相同的插槽,您需要确定谁发送了信号。你可以这样做:
def onIncrease(self):
button = self.sender()
if isinstance(button, QtGui.QPushButton):
buttonName = button.text()
if buttonName == 'name of button 1':
self.itemCount[0].setText(str(int(self.itemCount[0])+1))
elif buttonName == 'name of button 2':
...
当然,假设您将每个QLineEdit放在数组self.itemCount
中。
由于您的所有按钮都具有相同的名称,我们需要使用其他方法。
# in addRow
self.increase.clicked.connect(lambda: self.onIncrease(itemCount))
def onIncrease(self, edit):
edit.setText(str(int(edit.text()+1))