2016-09-26 2 views
0

私が作成した単純なGUIで、動的に作成されたチェックボックスがチェックされているかチェックされていないかを判断するのに問題があります。PyQt5で動的に作成されたQStandardItemsのプロパティにアクセスする

私は関連コードを適用し、それを下に貼り付けました。 4つのQStandardItemを作成して名前を付けるのは簡単かもしれませんが、私は非常に多くの異なるアイテムを含む多くのリストを扱っています。したがって、自分で作成することは実際には実現できません。

これらのプロパティにアクセスする方法を知る助けがあれば、大歓迎です。要するに

from PyQt5.QtWidgets import * 
from PyQt5.QtGui import * 

class Splash(QWidget): 
    def __init__(self): 
     super().__init__() 

     # imagine this is a very long list... 
     self.seasons = ['summer','autumn','winter','spring'] 

     self.initUI() 

    def initUI(self): 
     layout = QVBoxLayout() 

     list = QListView() 
     model = QStandardItemModel() 
     list.setModel(model) 

     printbtn = QPushButton('print values') 
     printbtn.clicked.connect(self.print_action) 

     for season in self.seasons: 
      item = QStandardItem(season) 
      item.setCheckable(True) 
      model.appendRow(item) 

     model.dataChanged.connect(lambda: self.print_action(item.text())) 


     layout.addWidget(printbtn) 
     layout.addWidget(list) 

     self.setLayout(layout) 
     self.show() 

    def print_action(self, item): 
     print('changed', item) 

if __name__ == '__main__': 
    import sys 
    app = QApplication(sys.argv) 
    ex = Splash() 
    sys.exit(app.exec_()) 

- アイテムがmodel.dataChangedを使用して関数にそれを接続するチェックされているが、それは季節を区別できない場合に検出することができます。

答えて

0

リスト(またはモデル)への参照を保持した場合、あなたは彼らのテキストでアイテムを検索して、そのチェック状態を取得することができます:

def print_action(self): 
    model = self.list.model() 
    for text in 'summer', 'autumn', 'winter', 'spring': 
     items = model.findItems(text) 
     if items: 
      checked = items[0].checkState() == Qt.Checked 
      print('%s = %s' % (text, checked)) 
+0

鮮やかな、私が探しているもの。 – yvesva

0

アイテムのcheckStateが変更されたときに通知を受けたいと思うようです。

私の意見では、2つの方法が考えられます。

最初に、QModelはビューを更新するために "dataChanged"を送出するので、アイテムのcheckStateが変更される可能性があることを示す信号を接続することができます。

model.dataChanged.connect(self.test) 

def test(self): 
    pass 

第2に、タイマーを使用して自分自身に通知し、自分で確認します。

timer = QTimer() 
timer.timeout.connect(self.test) 
timer.start(1000) 
+0

私は申し訳ありませんが、あなたの答えを使って、4つのQStandardItemのチェックステートのそれぞれを推論する方法を理解するのが難しいです。あなたは精巧にお考えですか? – yvesva

+0

あなたはアイテムのcheckStateと季節を印刷したいのですか? –

+0

この質問の目的のために印刷しますが、私が書いていることについては、ユーザーがボックスをチェックしているかどうか/ボックスのチェックステートが何であるかを知る必要があります。 – yvesva

関連する問題