Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.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 PyQt listView复选框选中/未选中时连接_Python_Pyqt_Pyqt5 - Fatal编程技术网

Python PyQt listView复选框选中/未选中时连接

Python PyQt listView复选框选中/未选中时连接,python,pyqt,pyqt5,Python,Pyqt,Pyqt5,我可以通过迭代QListView来确定如何检查是否选中了所有复选框,如所述 但是,是否有一种方法可以在选中单个框时连接到函数,该框也可能与QListView中当前选定的对象不同?例如,相当于self.listview.clicked.connect(foo) 最小值与上面的链接示例相结合: from PyQt5 import QtCore from PyQt5 import QtGui from PyQt5.QtCore import QTimer from PyQt5.QtWidgets i

我可以通过迭代QListView来确定如何检查是否选中了所有复选框,如所述

但是,是否有一种方法可以在选中单个框时连接到函数,该框也可能与QListView中当前选定的对象不同?例如,相当于
self.listview.clicked.connect(foo)

最小值与上面的链接示例相结合:

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

        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.clicked.connect(self.getSelectedListItem)

        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:
                print(item.text(), "was checked")
        print("rerun timed script to list checked objects again")



    def getSelectedListItem(self):
        """
        Gets the name and row of the selected object.
        """
        currentSelection = self.list_view.selectedIndexes()

        name  = None
        row   = None
        index = None

        # Set name for currently selected object in listview
        for obj_index in currentSelection:
            item  = self.model.itemFromIndex(obj_index)
            row   = item.row()
            index = self.model.index(row, 0)
            name  = self.model.data(index)

        self.currName  = name
        self.currRow   = row
        self.currIndx  = index

        print(self.currName)


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

在这种情况下,我们可以使用委托来检测状态的变化,另一种解决方案是使用模型,但由于每个模型都必须修改,因此实现起来会更麻烦。解决方案是下一个

import sys

from PyQt5 import QtCore, QtGui, QtWidgets


class Delegate(QtWidgets.QStyledItemDelegate):
    def editorEvent(self, event, model, option, index):
        checked = index.data(QtCore.Qt.CheckStateRole)
        ret = QtWidgets.QStyledItemDelegate.editorEvent(self, event, model, option, index)
        if checked != index.data(QtCore.Qt.CheckStateRole):
            self.parent().checked.emit(index)
        return ret


class ListView(QtWidgets.QListView):
    checked = QtCore.pyqtSignal(QtCore.QModelIndex)
    def __init__(self, *args, **kwargs):
        super(ListView, self).__init__(*args, **kwargs)
        self.setItemDelegate(Delegate(self))


class AppRemovalPage(QtWidgets.QWizardPage):
    def __init__( self, parent=None):
        super(AppRemovalPage, self).__init__(parent)
        self.setTitle('Apps to Remove')
        self.setSubTitle('Listview')
        self.list_view = ListView(self)
        self.list_view.setMinimumSize(465, 200)

        self.model = QtGui.QStandardItemModel(self)
        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.checked.connect(self.onChecked)

    @QtCore.pyqtSlot(QtCore.QModelIndex)
    def onChecked(self, index):
        item = self.model.itemFromIndex(index)
        if item.checkState() == QtCore.Qt.Checked:
            print(item.text(), "was checked")
        else:
            print(item.text(), "was unchecked")

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    listview = AppRemovalPage()
    listview.show()
    sys.exit(app.exec_())