2013-04-09 82 views
0

我創建使用PySide Python中的小應用程序。我從文本文件中讀取行,並在單獨的QLineEdit Widget中顯示每行。每個「條目」都有2行編輯和2個QPushButton。對於每一行我都添加這些小部件。我的問題是我爲QPushButtons設置了一個信號插槽,但是當生成所有「條目」時,只有最後一個QPushButtons條目連接到插槽。願有人請幫助我。PySide一個插槽多個部件

這裏是我的代碼

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

似乎有在你的代碼所缺少的東西。你是否只爲每個條目調用一次addRow?你在哪裏調用'addRow'?什麼是'setupUi'和'parseBossItem'函數? – 2013-04-09 03:35:38

+0

我爲我解析的文件中的每一行調用addRow()。 我打電話addrow()在parseBossItem功能(因爲你可以看到),而setupUI是什麼設置的PySide UI界面。 parseBossItem是我的插槽,用於我的currentIndexChanged信號。 – user1976336 2013-04-09 19:40:40

回答

1

這是因爲你只連接的最後一個條目。

這裏是你實際上是在做什麼:

  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... 

要使用相同的插槽形式不同的發送者,你需要確定誰發送的信號。你可以做這樣的事情:

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)) 
+0

你是否也知道如何在itemCount中增加一個數字,當按下相應的pushButton時? – user1976336 2013-04-11 00:39:11

+0

我編輯了答案給你一個例子。如果它能幫助你,請提高答案。 – 2013-04-11 00:59:38

+0

你的編輯會的工作,考慮到所有的QPushButtons有不同的名稱,但因爲我這只是一個「+」按鈕欄,它們都具有相同的文字。 – user1976336 2013-04-11 02:24:16