2016-09-26 5 views
0

Ich habe ein Problem festzustellen, ob die Checkboxen, die dynamisch erstellt werden, vom Benutzer in einer einfachen GUI, die ich erstellt habe, aktiviert oder deaktiviert sind.Zugriff auf Eigenschaft dynamisch erstellter QStandardItems in PyQt5

Ich habe den entsprechenden Code angepasst und eingefügt es unten. Obwohl es einfach sein kann, nur 4 QStandardItems zu erstellen und zu benennen, habe ich es mit vielen Listen zu tun, die viele verschiedene Elemente enthalten, die sich ziemlich viel ändern, so dass es nicht wirklich machbar ist, sie selbst zu erstellen.

Jede Hilfe, die herausfindet, wie man auf diese Eigenschaften zugreift, würde sehr geschätzt werden.

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_()) 

Kurz gesagt - ich kann erkennen, wenn ein Element überprüft wurde model.dataChanged verwenden und dass zu einer Funktion verbinden, aber es kann zwischen den Jahreszeiten nicht unterscheiden.

Antwort

0

Wenn Sie einen Verweis auf die Liste (oder Modell) zu halten, die Sie für die Einzelteile durch ihren Text suchen können und dann ihre Check-Zustand erhalten:

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

Brilliant, genau wonach ich suche. – yvesva

0

Offenbar möchten Sie benachrichtigt werden, wenn der checkState eines Artikels geändert wurde.

Meiner Meinung nach gibt es zwei Möglichkeiten.

Zuerst gibt QModel "dataChanged" aus, um die Ansicht zu aktualisieren, damit Sie das Signal verbinden können, was bedeutet, dass der checkState eines Elements geändert werden kann.

Zweiter Weg, verwenden Sie einen Timer, um sich zu benachrichtigen, und Sie überprüfen es selbst.

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

Es tut mir leid, Ich habe einige Schwierigkeiten zu verstehen, wie ich mit Ihrer Antwort jedes der vier QStandardItem-Prüfstände ableiten könnte. Macht es Ihnen etwas ausarbeiten? – yvesva

+0

Meinen Sie, dass Sie den CheckState und die Jahreszeiten des Artikels drucken möchten? –

+0

Drucken für den Zweck dieser Frage, aber für das, was ich schreibe, muss ich nur wissen, ob der Benutzer das Kästchen aktiviert hat/welches Kontrollkästchen die Box ist. – yvesva

Verwandte Themen