Как инициировать событие, когда содержимое QListWidget добавлено или удалено

При добавлении элементов в QListWidget я хочу включить или отключить действие в зависимости от того, есть ли элементы в QListWidget. Есть ли какой-то список listWidget.itemChanged.connect(self.checkListLength), кроме изменения количества элементов в QlistWidget, который я мог бы использовать? Обычно после каждого изменения в виджете я просто проверяю, но многие разные источники будут изменять его, и было бы разумнее просто прислушаться к изменению.

Я пробовал каждое соединение, которое мог найти, чтобы увидеть, вернет ли оно желаемый результат, и, похоже, это не так.

Вот пример, который компилируется, но не включает действие Rename Selection. Мы импортируем имена файлов в QListWidget. В этом примере мы могли бы просто включить его после использования открытой папки, но для моего кода это будет не так просто.

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 есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
1 953
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Если вы хотите узнать, был ли элемент добавлен или удален в QListWidget, вы должны сделать это через внутреннюю модель, которая имеет сигналы rowsInserted и rowsRemoved соответственно.

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

Извините, что отвечаю на свой вопрос, но я разобрался и не хотел оставлять кого-то в подвешенном состоянии.

Для этого вам нужно сослаться на модель 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

Я надеюсь, что это поможет любому с той же проблемой.

Очень помогли мне с моим проектом! По какой-то причине всякий раз, когда я пытался прокручивать виджет списка вниз каждый раз, когда что-то вставлял, это не срабатывало. Однако использование этого метода сработало как шарм! Слава!

Diggy. 27.12.2020 03:01

Другие вопросы по теме