PySide一个插槽到多个小部件

2024-10-02 22:26:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用PySide在python中创建一个小应用程序。我从文本文件中读取行,并在单独的QLineEdit小部件中显示每一行。每个“条目”有2行编辑和2个qpushbutton。对于每一行我都添加了这些小部件。我的问题是,我为qpushbutton设置了一个信号槽,但是当所有的“条目”都生成时,只有最后一个条目qpushbutton连接到该槽。有人能帮帮我吗。在

这是我的密码

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)

Tags: selfdefline条目itemlistlayoutqtgui
1条回答
网友
1楼 · 发布于 2024-10-02 22:26:01

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

以下是您实际在做的:

  1. 为项目1添加行,并将按钮小部件分配给self.decreaseself.increase。在
  2. 为项目2添加行,用新创建的小部件替换self.decreaseself.increase的值。在
  3. 连接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...

要使用来自不同发送者的同一个插槽,您需要确定是谁发送了信号。你可以这样做:

^{pr2}$

当然,这是假设您将每个QLineEdit放入数组self.itemCount。在


由于所有按钮的名称相同,我们需要使用另一种方法。在

# in addRow
self.increase.clicked.connect(lambda: self.onIncrease(itemCount))

def onIncrease(self, edit):
    edit.setText(str(int(edit.text()+1))

相关问题 更多 >