2016-12-27 51 views
0

我已经从一个文件填充了一个Qlistview,文件中的每一行都变成了一行。现在,我想有另一个函数来创建qlistview中所有选中项目的另一个文件。我的列表视图如下。如何获取Qlistview中的Checked项目?

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

你的意思是你想知道用户UN /检查列表中的项目时,或者更确切地说,查找被选中所有列表项? – 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

输出:

a 
d 
e 
print checked items executed 
+0

再次感谢男人,你是最棒的!我只需将'file.write(item.text())'改为'file.write('%s \ n'%item.text())'就可以工作。我想我应该使用'QtCore.QFile.'来编写文件 – answerSeeker

+1

@TakakaiWasumi更新我的解决方案 – eyllanesc

+0

除非您需要Qt类的特定功能,否则您应该优先考虑Python类。在你的代码中,Python文件对象也可以工作,请参阅我的更新答案。而且,lambda是不必要的。 – Schollii

3

当我运行这在Python 3.5和PyQt5,它工作得很好,它打印正确的模式和选定项目。我删除了文件读/写行以进行测试。对于PyQt4和Python 2.7,您只需修复一些导入和打印语句。运行它,勾选一些项目,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_() 

如果我对号a,c和d我看到:

a w 
c a 
d a 
print checked items executed 

更新展示如何Python的文件对象也可以(实际上是在更好的代码,因为它支持使用情境管理):

​​3210

连接可以写成wizard.button(QWizard.NextButton).clicked.connect(appremoval.print_checked_items)

+0

它的工作方式,但我试图创建一个文件,它doesn不打印任何东西,但“打印检查项目执行”这就是令我困惑的原因 – answerSeeker

+1

@TakakaiWasumi所以你的问题与PyQt无关,这是纯粹的Python问题。我更新了答案,尽管已经接受了另一个答案,表明不需要QFile(至少,在Python 3.5/PyQt 5.5/Windows 7平台上工作)。 – Schollii

相关问题