QListWidget 添加或删除内容时如何触发事件
How to trigger an event when a QListWidget has contents added or removed
向 QListWidget 添加元素时,我想根据 QListWidget 中是否有元素来启用或禁用操作。除了我可以使用的 QlistWidget 中元素数量的变化之外,是否有列表 listWidget.itemChanged.connect(self.checkListLength)
?通常在每次更改小部件后,我都会进行检查,但许多不同的来源会对其进行更改,因此只听更改会更有意义。
我已经尝试了我能找到的每一个连接,看看它是否会 return 想要的结果,但似乎没有。
这是一个编译但不启用操作 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_())
如果您想知道某个项目是否被添加或删除到 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
希望对遇到同样问题的人有所帮助。
向 QListWidget 添加元素时,我想根据 QListWidget 中是否有元素来启用或禁用操作。除了我可以使用的 QlistWidget 中元素数量的变化之外,是否有列表 listWidget.itemChanged.connect(self.checkListLength)
?通常在每次更改小部件后,我都会进行检查,但许多不同的来源会对其进行更改,因此只听更改会更有意义。
我已经尝试了我能找到的每一个连接,看看它是否会 return 想要的结果,但似乎没有。
这是一个编译但不启用操作 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_())
如果您想知道某个项目是否被添加或删除到 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
希望对遇到同样问题的人有所帮助。