0

我正在使用 PySide 在 python 中创建一个小应用程序。我从文本文件中读取行并在单独的 QLineEdit 小部件中显示每一行。每个“条目”有 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)
4

1 回答 1

1

这是因为您只连接了最后一个条目。

这是您实际在做的事情:

  1. 您为项目 1 添加行,并将按钮小部件分配给self.decrease, self.increase
  2. 您为项目 2 添加行self.decreaseself.increase用新创建的小部件替换 的值。
  3. 您 connect 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))
于 2013-04-10T13:32:18.443 回答