2016-12-27 3 views
0

Ich habe eine Qlistview aus einer Datei gefüllt, jede Zeile in der Datei wird zu einer Zeile. Nun möchte ich eine andere Funktion haben, die eine andere Datei aus allen überprüften Elementen in der qlistview erstellt. Meine Listenansicht geht wie folgt.Wie erhalte ich die markierten Elemente in einer Qlistview?

def show_list(self, file_in): 
     QListView.__init__(self) 
     QListView.setWindowFlags(self, QtCore.Qt.WindowStaysOnTopHint) 
     QListView.setWindowTitle(self, "ListView") 
     self.buttonBox = QtGui.QDialogButtonBox(self) 
     self.buttonBox.setOrientation(QtCore.Qt.Horizontal) 
     self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok) 
     list_view = QListView(self) 
     list_view.setMinimumSize(350,350) 

     self.verticalLayout = QtGui.QVBoxLayout(self) 
     self.verticalLayout.addWidget(list_view) 
     self.verticalLayout.addWidget(self.buttonBox) 
     self.buttonBox.accepted.connect(self.close) 
     self.buttonBox.rejected.connect(self.close) 
     model = QStandardItemModel(list_view) 
     with open(file_in) as f: 
      if f is not None: 
       item = f.readlines() 
      for line in item: 
       item = QStandardItem(line) 
       item.setCheckable(True) 
       item.setCheckState(QtCore.Qt.Unchecked) 
       model.appendRow(item) 

     list_view.setModel(model) 
     list_view.show() 

Dies ist mein Versuch, bis jetzt mein gewünschtes Ergebnis zu erhalten. Leider druckt es meine geprüften Artikel nicht. Wenn ich so genannt werde self.print_checked_items(model) Ich frage mich, was könnte falsch sein?

def print_checked_items(self, model): 
    path = "/home/test1/checked.txt" 
    for index in range(model.rowCount()): 
     item = model.item(index) 
     if item.isCheckable() and item.checkState() == QtCore.Qt.Checked: 
      with open(path, "a") as f_out: 
       print ('%s\n' % item.text()) 
       f_out.write('%s\n' % item.text() 
+0

Sie meinen, dass Sie, wenn der Benutzer un/Schecks Listenelemente wissen wollen, oder vielmehr alle Listeneinträge finden, die überprüft werden? – Schollii

+0

Nein, ich möchte eine Liste aller geprüften Elemente aus der Liste haben, nachdem ein Benutzer sie überprüft hat. – answerSeeker

+0

Schreiben Sie eine Funktion, die Elemente der Liste überprüft und deren aktivierten Status überprüft. Sende den Code, dann können wir helfen. – Schollii

Antwort

2
import sys 
from PyQt4 import QtGui 
from PyQt4 import QtCore 


class AppRemovalPage(QtGui.QWizardPage): 
    def __init__(self, parent=None): 
     super(AppRemovalPage, self).__init__(parent=parent) 
     self.setTitle('Apps to Remove') 
     self.setSubTitle('Listview') 
     self.list_view = QtGui.QListView(self) 
     self.list_view.setMinimumSize(465, 200) 
     layout = QtGui.QVBoxLayout(self) 
     layout.addWidget(self.list_view) 
     self.setLayout(layout) 
     self.items = [] 
     self.isWritten = False 

     loo = "/home/test1/file.txt" 

     self.model = QtGui.QStandardItemModel(self.list_view) 

     self.model.itemChanged.connect(self.setItems) 

     file = QtCore.QFile(loo) 
     if file.open(QtCore.QFile.ReadOnly | QtCore.QFile.Text): 
      while not file.atEnd(): 
       line = bytearray(file.readLine()).decode().strip() 
       item = QtGui.QStandardItem(line) 
       item.setCheckable(True) 
       item.setCheckState(QtCore.Qt.Unchecked) 
       self.model.appendRow(item) 
     self.list_view.setModel(self.model) 
     self.list_view.show() 

    def setItems(self, item): 
     if item.checkState() == QtCore.Qt.Checked: 
      self.items.append(item) 
     if item.checkState() == QtCore.Qt.Unchecked: 
      self.items.remove(item) 

    def print_checked_items(self): 
     path = "/home/test1/checked.txt" 
     mode = QtCore.QFile.Append if self.isWritten else QtCore.QFile.WriteOnly 
     if len(self.items) > 0: 
      file = QtCore.QFile(path) 
      if file.open(mode): 
       for item in self.items: 
        print('%s' % item.text()) 
        file.write(item.text() + "\n") 
      file.close() 
     print("print checked items executed") 

if __name__ == '__main__': 
    app = QtGui.QApplication(sys.argv) 
    wizard = QtGui.QWizard() 

    appremoval = AppRemovalPage() 
    wizard.addPage(appremoval) 
    wizard.addPage(QtGui.QWizardPage()) 

    wizard.button(QtGui.QWizard.NextButton).clicked.connect(appremoval.print_checked_items) 
    wizard.show() 
    sys.exit(app.exec_()) 

enter image description here

Ausgang:

a 
d 
e 
print checked items executed 
+0

Danke nochmal, Mann, du bist der Beste! Ich musste nur Ihre 'file.write (item.text())' in 'file.write ('% s \ n'% item.text())' ändern, damit es funktioniert. Ich denke, ich hätte 'QtCore.QFile.' für das Schreiben von Dateien verwenden sollen. – answerSeeker

+1

@TatakaiWasumi update meine Lösung – eyllanesc

+0

Sie sollten Python-Klassen Präferenz geben, es sei denn, es gibt bestimmte Fähigkeiten, die Sie von einer Qt-Klasse benötigen. In Ihrem Code funktioniert das Python-Dateiobjekt genauso gut, siehe meine aktualisierte Antwort. Außerdem ist das Lambda unnötig. – Schollii

3

Wenn ich laufen diese in Python 3.5 und PyQt5, es funktioniert gut, druckt es die richtigen Modi und markierten Elemente. Ich habe die Lese-/Schreibzeilen der Datei zum Testen entfernt. Für PyQt4 und Python 2.7 sollten Sie nur ein paar Imports und die print-Anweisung reparieren. Führen Sie es aus, markieren Sie ein paar Elemente und nach 5 Sekunden, was sehen Sie in der Konsole?

from PyQt5 import QtCore 

from PyQt5 import QtGui 
from PyQt5.QtCore import QTimer 
from PyQt5.QtWidgets import QApplication, QWizardPage, QListView 


class AppRemovalPage(QWizardPage): 
    def __init__(self, parent): 
     super(AppRemovalPage, self).__init__(parent) 
     self.setTitle('Apps to Remove') 
     self.setSubTitle('Listview') 
     self.list_view = QListView(self) 
     self.list_view.setMinimumSize(465, 200) 
     self.isWritten = False 
     loo = "/home/test1/file.txt" 

     self.model = QtGui.QStandardItemModel(self.list_view) 
     for line in ('a', 'b', 'c', 'd', 'e'): 
      self.item = QtGui.QStandardItem(line) 
      self.item.setCheckable(True) 
      self.item.setCheckState(QtCore.Qt.Unchecked) 
      self.model.appendRow(self.item) 

     self.list_view.setModel(self.model) 
     self.list_view.show() 


    def print_checked_items(self): 
     for index in range(self.model.rowCount()): 
      item = self.model.item(index) 
      if item.checkState() == QtCore.Qt.Checked: 
       if self.isWritten: 
        mode = "a" 
       else: 
        mode = "w" 
        self.isWritten = True 
       print ('%s' % item.text()) 

     print("print checked items executed") 


app = QApplication([]) 
listview = AppRemovalPage(None) 
listview.show() 
QTimer.singleShot(5000, listview.print_checked_items) 
app.exec_() 

Wenn ich a, c und d Ankreuzen sehe ich das:

a w 
c a 
d a 
print checked items executed 

aktualisiert zu zeigen, wie Python-Datei-Objekt funktioniert auch (und ist in der Tat besser Code, da es die Verwendung von Kontext unterstützt Management):

def print_checked_items(self): 
    path = "checked.txt" 
    mode = 'a' if self.isWritten else 'w' 
    if len(self.items) > 0: 
     with open(path, mode) as file: 
      for item in self.items: 
       print('%s' % item.text()) 
       file.write(item.text() + "\n") 
     file.close() 
    print("print checked items executed") 

Die Verbindung geschrieben werden kann wizard.button(QWizard.NextButton).clicked.connect(appremoval.print_checked_items)

+0

Es funktioniert auf Ihre Weise, aber ich versuche, eine Datei zu erstellen und es doesn 't print alles außer "print checked items executed" Das ist, was mich verwirrt – answerSeeker

+1

@TatakaiWasumi Also hat Ihre Frage nichts mit PyQt zu tun, es ist Python Problem. Ich habe meine Antwort aktualisiert, obwohl eine andere bereits akzeptiert wurde, um zu zeigen, dass QFile nicht erforderlich ist (zumindest auf Python 3.5/PyQt 5.5/Windows 7-Plattform). – Schollii

Verwandte Themen