PySide一个插槽到多个小部件

时间:2013-04-09 00:17:21

标签: python pyqt pyside

我正在使用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)

1 个答案:

答案 0 :(得分:1)

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

以下是您的实际操作:

  1. 您为第1项添加了行,并将按钮小部件分配给self.decreaseself.increase
  2. 您为第2项添加了行,用新创建的小部件替换self.decreaseself.increase的值。
  3. 您连接self.increase,现在是最后添加的小部件。
  4. 如果您在创建小部件后不需要访问它们,则应考虑使用局部变量(例如,不使用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))