如何在 Qlistview 中获取选中的项目? [英] How do I get the Checked items in a Qlistview?

查看:354
本文介绍了如何在 Qlistview 中获取选中的项目?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我从一个文件中填充了一个 Qlistview,文件中的每一行都变成了一行.现在,我想要另一个函数来从 qlistview 中的所有选中项目创建另一个文件.我的列表视图如下.

I've populated a Qlistview from a file, each line in the file becomes a row. Now, I'd like to have another function that creates another file from all the checked items in the qlistview. My listview goes as follows.

 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) 时,我想知道有什么问题?

This is my attempt so far to get my desired result. Unfortunately, It doesn't print my checked items. When called like this self.print_checked_items(model) I'm wondering what could be wrong?

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

推荐答案

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

输出:

a
d
e
print checked items executed

这篇关于如何在 Qlistview 中获取选中的项目?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆