2013-04-02 60 views
0

我正在學習PyQt4(我正在使用4.4.4版本),我對Python(Python 2.5)很新。我有一個QListWidget和一個QPushButton的GUI。我希望用戶能夠單擊以在列表中選擇一個條目,然後單擊QPushButton並讓選定條目消失(從QList中刪除)。我在這個問題上一直在抨擊我的頭一個多星期,我會深表感謝。PyQt4:使用QPushButton小部件從QList小部件中刪除項目

目前,我的GUI出現了,我可以選擇不同的列表項(一次只有一個),但是當我點擊QPushButton時,沒有任何反應。選擇顏色從藍色變爲灰色,但不刪除條目。命令提示符(Windows 7)中不顯示錯誤。

我已經定義了一個函數remove(),我用它作爲QPushButton的插槽。我相信QPushButton.connect爲Qt Signal to Python Slot提供了正確的定義,基於我見過的類似問題的答案,但是這些項目並未被刪除。但是,remove函數甚至沒有被觸發。我在函數中有一個print語句,但是當我單擊QPushButton時,它不會被調用,這是我知道函數沒有被調用的原因。

這是我最近的代碼:(我在meta-SO上閱讀了一篇關於大代碼塊的非常強烈的帖子,所以我將它縮減爲我認爲相關的部分:列表創建,按鈕創建和刪除功能,我試圖用作一個插槽,我留下了評論,指出其他部分是什麼,所以如果你認爲我已經遺漏了一些可以幫助的東西,讓我知道和我會重新加入)

class questionGUI(QtGui.QWidget): 
#This class is the window of the gui. 

    def __init__(self): 
     super(questionGUI,self).__init__() 
     #Layout 
     grid = QtGui.QGridLayout() 
     grid.setSpacing(10) 

     #Labels Needed 
     ... 

     #Question List 
     self.qList = QtGui.QListWidget() 
     #print self.qList 
     self.qList.setSelectionMode(QtGui.QAbstractItemView.SingleSelection) 
     entries = ['[Pick Image] <Default>','[Slider Question] <Default>', '[Comment Box] <Default>'] 

     for i in entries: 
      item = QtGui.QListWidgetItem(i) 
      self.qList.addItem(item) 

     #Type select 
     ... 

     #Text insert Needed 
     ... 

     #Buttons Needed 
     deleteButton = QtGui.QPushButton('Delete Question') 
     deleteButton.connect(deleteButton,QtCore.SIGNAL('itemClicked(clicked)'),lambda: self.remove) 

     addQuestionButton = QtGui.QPushButton('Add Question') 
     ... 

     doneButton = QtGui.QPushButton('Done') 
     ... 

     #Parameters Needed 
     ... 

     #Layout Placement and Window dimensions 
     ... 

    def addQuestion(self): 
     ... 

    def remove(self): 
     print 'remove triggered' 
     print self.qList.currentItem() 
     self.qList.removeItemWidget(self.qList.currentItem()) 

... 

我試圖發佈圖片,但我沒有足夠的聲望。如果您認爲圖片有用,請告訴我,我可以將其發送給您。

+0

PyQt 4.4.4真的很舊。有沒有任何理由使用這樣一個古老的版本? – Avaris

+0

首先:我爲防務承包商工作。我們的IT部門。保持嚴格控制的「批准」軟件列表,這些軟件始終是許多版本。我仍在使用Python 2.5。是的,這是愚蠢的。其次:我也不是我自己的電腦上的管理員,所以我不能只下載這個開源軟件並使用它們來繞過IT。第三,也是最重要的一點:這是一個項目的一部分,用於更新一箇舊的內部軟件程序,Py2.5和PyQt4.4.4,這是1000行的線和不斷使用。把它離線重寫Py3.0和PyQt5中的所有東西不是一種選擇。 – SatelliteEyes

+0

我明白了。版本與您的問題無關。它只是讓我覺得「奇怪」。但是,如果它與一些遺留代碼相關聯,這是有道理的。 – Avaris

回答

1

你中混合的信號:

deleteButton.connect(deleteButton,QtCore.SIGNAL('itemClicked(clicked)'),lambda: self.remove) 

deleteButtonQPushButton,但​​貌似將信號從QListWidget帶有錯誤簽名。因爲QPushButton沒有這個信號,所以沒有連接。 Qt不會引發連接失敗的錯誤,但.connect方法有一個bool返回值,指示嘗試連接的成功/失敗。

另外,作爲插槽的lambda: self.remove沒有意義。插槽應該是一個可調用的信號發射調用。當然,lambda創建了一個函數,但是您所做的全部是參考方法self.removelambda將被調用,self.remove不會。只需self.remove作爲一個插槽就足夠了。

您應該使用clicked()信號(或clicked(bool),如果你關心的checked值)按鈕:

deleteButton.connect(deleteButton, QtCore.SIGNAL('clicked()'), self.remove) 

編輯

另一個問題:你remove方法不會做你想。 removeItemWidget不會刪除項目,它會刪除內部的小部件該項目(如果您設置了其中一項)。它與setItemWidget對應。

您應該使用takeItem刪除項目。

def remove(self): 
    self.qList.takeItem(self.qList.currentRow()) 
+0

這個工程!非常感謝你的幫助!我認爲我基本上需要兩個信號:點擊列表來選擇項目並單擊按鈕將其刪除。 itemClicked是一個QListWidget函數,這是我嘗試使用這兩個信號。我現在明白,這是不必要的,因爲點擊列表條目將自動更新當前行或項目,所以明確指出項目已被點擊是沒有必要的。 – SatelliteEyes

+0

@Avaris請看問題http://stackoverflow.com/questions/16221810/how-to-handle-mouse-events-in-qt。謝謝。 – Alex

相關問題