如何在QListWidget添加或删除内容时触发事件

问题描述 投票:1回答:2

向QListWidget添加元素时,我想启用或禁用动作,具体取决于QListWidget中是否有元素。是否有一些列表listWidget.itemChanged.connect(self.checkListLength)除了我可以使用的QlistWidget中的元素数量的变化?通常在每次更改Widget后我都会进行检查,但是许多不同的来源都会改变它,只是听取更改会更有意义。

我已经尝试了每一个我能找到的连接,看它是否会返回所需的结果而且似乎没有。

这是一个编译但不启用动作Rename Selection的示例。我们将文件名导入QListWidget。在这个例子中,我们可以在使用open文件夹后启用它,但对于我的代码,它不会那么容易。

import sys
from os import listdir
from os.path import isfile, join
from PyQt5.QtWidgets import (
    QMainWindow, QAction, QHBoxLayout, QWidget, QListWidget, 
    QListWidgetItem, QAbstractItemView, QApplication, QDialog, qApp, QToolBar, QFileDialog
)
from PyQt5.QtGui import QIcon
from PyQt5 import QtCore

class MainGui(QMainWindow):

    def __init__(self):
        super().__init__()
        self.mainWidget = QWidget()
        self.setCentralWidget(self.mainWidget)
        self.initUI()

    def initUI(self):  
        #TopIcon
        self.exitAct = QAction(QIcon('img/x-square.svg'), 'Exit', self)
        self.exitAct.setShortcut('Ctrl+Q')
        self.exitAct.triggered.connect(qApp.quit)

        #Import Folder
        self.importAct = QAction(QIcon('img/folder.svg'), 'Open Folder', self)
        self.importAct.setShortcut('Ctrl+N')
        self.importAct.triggered.connect(self.getFolder)

        #Rename Button
        self.renameAct = QAction(QIcon('img/edit.svg'), 'Rename Selection', self)
        self.renameAct.setShortcut('Ctrl+R')
        self.renameAct.setEnabled(False)

        self.toolbar = QToolBar('ToolBar')
        self.addToolBar(QtCore.Qt.LeftToolBarArea, self.toolbar)
        self.toolbar.addAction(self.exitAct)
        self.toolbar.addSeparator()
        self.toolbar.addAction(self.importAct)
        self.toolbar.addAction(self.renameAct)
        self.hbox = QHBoxLayout()
        self.listWidget = QListWidget()
        self.listWidget.setSelectionMode(QAbstractItemView.ExtendedSelection)
        self.listWidget.setGeometry(QtCore.QRect(10, 10, 211, 291))
        self.hbox.addWidget(self.listWidget)
        self.mainWidget.setLayout(self.hbox)
        self.show()

    def getFolder(self):
        self.ImportFolder = QFileDialog.getExistingDirectory(None, "Select Directory") 
        self.getFilesInDir(self.ImportFolder)

    def getFilesInDir(self, mypath):
        f = []
        files = [f for f in listdir(mypath) if isfile(join(mypath, f))]
        if files:
            self.listWidget.addItems(files)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    gui = MainGui()
    sys.exit(app.exec_())
python python-3.x pyqt pyqt5 qlistwidget
2个回答
1
投票

如果您想知道是否已将项添加或移除到QListWidget,则必须分别通过具有rowsInsertedrowsRemoved信号的内部模型来完成。

import sys
from os import listdir
from os.path import isfile, join
from PyQt5 import QtCore, QtGui, QtWidgets


class MainGui(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self.mainWidget = QtWidgets.QWidget()
        self.setCentralWidget(self.mainWidget)
        self.initUI()

    def initUI(self):
        # TopIcon
        self.exitAct = QtWidgets.QAction(
            QtGui.QIcon("img/x-square.svg"), "Exit", self
        )
        self.exitAct.setShortcut("Ctrl+Q")
        self.exitAct.triggered.connect(QtWidgets.qApp.quit)

        # Import Folder
        self.importAct = QtWidgets.QAction(
            QtGui.QIcon("img/folder.svg"), "Open Folder", self
        )
        self.importAct.setShortcut("Ctrl+N")
        self.importAct.triggered.connect(self.getFolder)

        # Rename Button
        self.renameAct = QtWidgets.QAction(
            QtGui.QIcon("img/edit.svg"), "Rename Selection", self
        )
        self.renameAct.setShortcut("Ctrl+R")
        self.renameAct.setEnabled(False)

        self.toolbar = QtWidgets.QToolBar("ToolBar")
        self.addToolBar(QtCore.Qt.LeftToolBarArea, self.toolbar)
        self.toolbar.addAction(self.exitAct)
        self.toolbar.addSeparator()
        self.toolbar.addAction(self.importAct)
        self.toolbar.addAction(self.renameAct)
        hbox = QtWidgets.QHBoxLayout(self.mainWidget)
        self.listWidget = QtWidgets.QListWidget()
        self.listWidget.setSelectionMode(
            QtWidgets.QAbstractItemView.ExtendedSelection
        )
        self.listWidget.model().rowsInserted.connect(self.on_rowsInserted)
        self.listWidget.model().rowsRemoved.connect(self.on_rowsRemoved)
        hbox.addWidget(self.listWidget)
        self.show()

    @QtCore.pyqtSlot(QtCore.QModelIndex, int, int)
    def on_rowsInserted(self, parent, first, last):
        print("Insert:", parent, first, last)

    @QtCore.pyqtSlot(QtCore.QModelIndex, int, int)
    def on_rowsRemoved(self, parent, first, last):
        print("Remove:", parent, first, last)

    @QtCore.pyqtSlot()
    def getFolder(self):
        importFolder = QtWidgets.QFileDialog.getExistingDirectory(
            None, "Select Directory"
        )
        self.getFilesInDir(importFolder)

    def getFilesInDir(self, mypath):
        files = [f for f in listdir(mypath) if isfile(join(mypath, f))]
        if files:
            self.listWidget.addItems(files)


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    gui = MainGui()
    sys.exit(app.exec_())

0
投票

我很抱歉回答了我自己的问题,但我想出来并且不想让任何人挂起。

您需要引用QListWidget的模型才能执行此操作:

self.lwModel = self.listWidget.model()
self.lwModel.rowsInserted.connect(self.checkListLength) #Any time an element is added run function
self.lwModel.rowsRemoved.connect(self.checkListLength) #Any time an element is removed run function

我希望能帮助任何有同样问题的人。

© www.soinside.com 2019 - 2024. All rights reserved.