2011-12-02 25 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)それ以降は選択されたアイテムが存在しないので、削除を2回実行して2つの行を順に削除することはできません。

答えて

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) 

EDIT

Qtのソースコードを見てみたら、それは上記のコードウォンを表示されます選択がリセットされる前にcurrentItemChangedシグナルが放出されるため、機能しません。

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

NB:

だから、代わりに、私はitemSelectionChanged信号を使用して、そしてselectedItemsをチェックすることをお勧めこのアプローチを取ることも、別の場所で、あなたのコード内のselectedItems()[0]currentItem()の使用を置き換えることを伴ってもよいです。

+0

あなたの答えのアイデアは私が探しているものだと思いますので、私は受け入れています。どのようなアイデアが、なぜ "変更されました"イベントの代わりに "currentItemChanging"イベントのように振る舞いますか?コード内で発生すると、クリックした行は「現在」ですが、current.isSelected()はFalseです。 previous.isSelected()はTrueですが。私は別の行をクリックすることができ、常に同じです、previous.isSelected()はTrueですが、現在はありません。 – Mike

+0

@Mike。私は別の方法で私の答えを更新しました。 – ekhumoro

+0

助けてくれてありがとう。私はちょうど間違った信号を使っていたと思う。この場合、選択されていない最初の行をクリックすると、selectedItems()は0が返されます。これは、行が選択される前に発生したかのようです。後続の行の変更は、値を持つselectedItems()を示しました。私はitemSelectionChangedへの信号を変更しました。そして、それは期待通りに稼働しています。これが発生すると、selectedItems()は私が期待するものを表します。助けてくれてありがとう! – Mike

関連する問題