2011-12-02 28 views
0

我有一個使用PySide以Python編寫的應用程序,UI是使用QT Designer創建的。在Python/PySide中清除選定的列表項(因此沒有選定的列表項)

我在窗口中有一個列表,其中有一組項目。當應用程序加載時,它似乎抓住列表中的最後一項(即使列表中沒有「突出顯示」的行)。如果我打破並檢查當時是否有選定的項目,我會得到列表中的最後一個項目。

我有這樣的代碼:

@QtCore.Slot(QTreeWidgetItem,QTreeWidgetItem) 
    def on_list_currentItemChanged(self,current=None,previous=None): 
     if current: 
      self.ui.actionDelete_Task.setEnabled(True) 
     else: 
      self.ui.actionDelete_Task.setEnabled(False) 

哪個確定是否存在選擇的當前項目。因此,在初始加載時,我希望當前爲空,但不是,它指向列表中的最後一個項目,即使沒有選擇項目。

有什麼,我失蹤?或者,或者,我如何告訴列表沒有選定的行/取消選擇所有行? (a)當表單加載並且列表最初顯示時沒有選定的項目時,刪除按鈕被禁用,甚至(b)如果有人應該通過這個刪除項目行動後,將不會有選定的項目(所以他們不能僅僅擊中刪除兩次並按順序刪除兩行)。

回答

1

當前項目和選擇不一定是相同的東西。當前項目是指具有鍵盤焦點的項目;選擇是指當前突出顯示的項目。所以沒有選擇的樹部件仍然會有一個當前項目(除非它沒有任何項目)。

所以,一個解決方案可能是簡單地檢查當前的項目也選擇:

@QtCore.Slot(QTreeWidgetItem, QTreeWidgetItem) 
def on_list_currentItemChanged(self, current=None, previous=None): 
    if current is not None and current.isSelected(): 
     self.ui.actionDelete_Task.setEnabled(True) 
    else: 
     self.ui.actionDelete_Task.setEnabled(False) 

編輯

考慮看看了Qt源代碼後,它出現在上面的代碼韓元不起作用,因爲currentItemChanged信號在選擇重置前發射。

所以,相反,我會建議使用itemSelectionChanged信號,並檢查selectedItems

def on_list_ItemSelectionChanged(self): 
    if self.list.selectedItems(): 
     self.ui.actionDelete_Task.setEnabled(True) 
    else: 
     self.ui.actionDelete_Task.setEnabled(False) 

注意:採用這種方法可能還需要在代碼中selectedItems()[0]別處取代的currentItem()使用。

+0

我認爲你的答案的想法是我正在尋找的,所以我接受。儘管爲什麼它會像「currentItemChanging」事件而不是「Changed」事件一樣表達任何想法?當它在我的代碼中觸發時,我點擊的那一行是「當前」,但是current.isSelected()是False。 previous.isSelected()雖然是True。我可以點擊不同的行,它總是相同的,previous.isSelected()是True,但不是最新的。 – Mike

+0

@Mike。我用另一種方法更新了我的答案。 – ekhumoro

+0

感謝您的幫助。我想我只是使用了錯誤的信號。在這種情況下,在沒有選中之後單擊第一行時,selectedItems()仍然返回0,就好像在行被選中之前觸發一樣。後續行更改顯示selectedItems()具有值。我將信號更改爲itemSelectionChanged,現在它按預期啓動並運行。當這種情況發生時,selectedItems()代表我期望的結果。非常感謝你的幫助! – Mike

相關問題