2016-12-27 25 views
0

ファイルからQlistviewを読み込んだので、ファイルの各行が1行になります。今、qlistviewのすべてのチェック項目から別のファイルを作成する別の関数を用意したいと思います。私のリストビューは次のようになります。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() 

これはこれまでの私の希望の結果を得るための試みです。残念ながら、チェックされたアイテムは印刷されません。このように呼び出されたときself.print_checked_items(model)私は何が間違っているのだろうと思っていますか?

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

を意味していますか? – Schollii

+0

いいえ、ユーザーがチェックした後、リストからすべてのチェック済みアイテムのリストを取得したいと思います。 – answerSeeker

+0

リストの項目を検索し、チェックされた状態をチェックする関数を記述します。私たちが助けることができるコードを投稿してください。 – Schollii

答えて

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

出力:あなたは、ユーザUN /チェックリストの項目を知っているかというにチェックされているすべてのリスト項目を見つけたいという

a 
d 
e 
print checked items executed 
+0

おかげさまで、あなたは最高です!あなたの 'file.write(item.text())'を 'file.write( '%s \ n'%item.text()) 'に変更して機能させるだけでした。私はファイル書き込みに 'QtCore.QFile.'を使用していたはずです。 – answerSeeker

+1

@Tata​​kaiWasumi私の解決策を更新してください – eyllanesc

+0

Qtクラスから必要な機能がない限り、Pythonクラスを優先させるべきです。あなたのコードでは、Pythonファイルオブジェクトも同様に動作します。私の更新された答えを見てください。また、ラムダは不要です。 – Schollii

3

これをPython 3.5とPyQt5で実行すると、正常に動作し、正しいモードとチェックマークが付いた項目が印刷されます。テストのためにファイルの読み書きラインを削除しました。 PyQt4とPython 2.7については、いくつかのインポートとprintステートメントを修正するだけで済みます。それを実行し、いくつかの項目にチェックマークを付け、5秒後にコンソールで何が見えますか?

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

私は、CとDをチェックすると、私はこれを参照してください。それは、コンテキストの使用をサポートしているので、Pythonのファイルオブジェクトでも動作します(実際にはより良いコードであるかを示すために更新

a w 
c a 
d a 
print checked items executed 

を管理):接続を書き込むことができます

​​3210

wizard.button(QWizard.NextButton).clicked.connect(appremoval.print_checked_items)

+0

それはあなたのやり方ですが、ファイルを作成しようとしています。 "チェックされた項目を実行しただけで何も印刷しません"それは私に困惑しているのです – answerSeeker

+1

@Tata​​kaiWasumiあなたの質問はPyQtとは関係がないので、純粋なPythonの問題です。 QFileが必要でない(少なくとも、Python 3.5/PyQt 5.5/Windows 7プラットフォームで作業していた)ことを示すために、もう1つはすでに受け入れられているにもかかわらず、自分の答えを更新しました。 – Schollii

関連する問題