Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在Qlistview中获取选中的项?_Python_Python 2.7_Pyqt_Pyqt4 - Fatal编程技术网

Python 如何在Qlistview中获取选中的项?

Python 如何在Qlistview中获取选中的项?,python,python-2.7,pyqt,pyqt4,Python,Python 2.7,Pyqt,Pyqt4,我从一个文件填充了一个Qlistview,文件中的每一行都变成一行。现在,我想使用另一个函数从qlistview中的所有选中项创建另一个文件。我的列表视图如下所示 def show_list(self, file_in): QListView.__init__(self) QListView.setWindowFlags(self, QtCore.Qt.WindowStaysOnTopHint) QListView.setWindowTitle(

我从一个文件填充了一个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\u checked\u 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()

当我在Python3.5和PyQt5中运行它时,它工作正常,它打印正确的模式和选中标记的项。我删除了用于测试的文件读/写行。对于PyQt4和Python2.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_()
如果我勾选a、c和d,我会看到:

a w
c a
d a
print checked items executed
更新以显示Python文件对象的工作原理(事实上,它是更好的代码,因为它支持使用上下文管理):


可以编写连接
wizard.button(QWizard.NextButton)。单击.connect(appremoval.print\u checked\u items)

当我在Python 3.5和PyQt5中运行此功能时,它工作正常,可以打印正确的模式和选中的项目。我删除了用于测试的文件读/写行。对于PyQt4和Python2.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_()
如果我勾选a、c和d,我会看到:

a w
c a
d a
print checked items executed
更新以显示Python文件对象的工作原理(事实上,它是更好的代码,因为它支持使用上下文管理):

可以写入连接
wizard.button(QWizard.NextButton)。单击。连接(appremoval.print\u checked\u items)

输出:

a
d
e
print checked items executed

输出:

a
d
e
print checked items executed


您的意思是想知道用户何时取消/检查列表项,或者更确切地说是查找所有已检查的列表项?否,我希望在用户检查完列表中的所有已检查项后,有一个列表。编写一个函数,查看列表项并检查其已检查状态。发布代码,然后我们可以提供帮助。@scholli请查看我的更新question@TatakaiWasumi请显示竞争代码您的意思是想知道用户何时取消/检查列表项,还是查找所有已检查的列表项?否,我希望在用户检查完列表中的所有已检查项目后,有一个列表。编写一个函数,查看列表中的项目并检查其已检查状态。发布代码,然后我们可以提供帮助。@scholli请查看我的更新question@TatakaiWasumi显示竞争代码请按您的方式运行,但我正在尝试创建一个文件,它只打印“打印已执行的检查项”,这是令人费解的me@TatakaiWasumi所以您的问题与PyQt无关,它是纯Python问题。我更新了我的答案,尽管另一个答案已经被接受,以表明QFile不是必需的(至少在Python 3.5/PyQt 5.5/Windows 7平台上工作)。它按照您的方式工作,但我正在尝试创建一个文件,它只打印“打印已执行的检查项”这就是令人费解的地方me@TatakaiWasumi所以您的问题与PyQt无关,它是纯Python问题。我更新了我的答案,尽管另一个答案已经被接受,以表明QFile不是必需的(至少,在Python3.5/PyQt 5.5/Windows7平台上工作过)!我只需将您的
file.write(item.text())
更改为`file.write(“%s\n”%item.text())`即可工作。我想我应该使用
QtCore.QFile。
对于文件编写,您应该优先使用Python类,除非您需要从Qt类获得特定的功能。在您的代码中,Python文件对象也可以正常工作,请参阅我的更新答案。此外,lambda是不必要的。@scholli如果它们完成相同的任务,那么是否优先考虑某个函数或另一个函数是一些琐事,但我喜欢使用单个库处理所有事情。确切地说,lambda函数不是必需的。你的回答既不比我的好也不比我的差。谢谢你的评论。@eyllanesc Chill bro',我从来没有说过我的答案更好。我只是指出了一些PyQt社区中为Tatakai所接受的最佳实践,Tatakai刚刚开始学习。有些人来这里是为了激发他们的自尊心,但很多人(可能是大多数人)只是来帮助别人,所以请放松,让人们从怀疑中受益。再次感谢你,伙计,你是最棒的!我只需将您的
file.write(item.text())
更改为`file.write(“%s\n”%item.text())`即可工作。我想我应该使用
QtCore.QFile。
对于文件编写,您应该优先使用Python类,除非您需要从Qt类获得特定的功能。在您的代码中,Python文件对象也可以正常工作,请参阅我的更新答案。此外,lambda是不必要的。@scholli如果它们完成相同的任务,那么是否优先考虑某个函数或另一个函数是一些琐事,但我喜欢使用单个库处理所有事情。确切地说,lambda函数不是必需的。你的回答既不比我的好也不比我的差。谢谢你的评论。@eyllanesc Chill bro',我从来没有说过我的答案更好。我只是指出了一些PyQt社区中为Tatakai所接受的最佳实践,Tatakai刚刚开始学习。有些人来这里是为了激发他们的自尊心,但很多人(可能大多数人)只是来帮助别人,所以放松,让人们从怀疑中受益。