Python 如何在QListWidget添加或删除内容时触发事件
在向QListWidget添加元素时,我希望根据QListWidget中是否有元素来启用或禁用操作。除了QlistWidget中我可以使用的元素数量的变化之外,是否还有列表Python 如何在QListWidget添加或删除内容时触发事件,python,python-3.x,pyqt,pyqt5,qlistwidget,Python,Python 3.x,Pyqt,Pyqt5,Qlistwidget,在向QListWidget添加元素时,我希望根据QListWidget中是否有元素来启用或禁用操作。除了QlistWidget中我可以使用的元素数量的变化之外,是否还有列表listWidget.itemChanged.connect(self.checkListLength)中的内容?通常情况下,每次修改小部件后,我都会进行检查,但许多不同的来源都会对其进行修改,只需倾听修改就更有意义了 我已经尝试了我能找到的每一个连接,看看它是否会返回期望的结果,但似乎没有 下面是一个编译但不启用操作重命名选
listWidget.itemChanged.connect(self.checkListLength)
中的内容?通常情况下,每次修改小部件后,我都会进行检查,但许多不同的来源都会对其进行修改,只需倾听修改就更有意义了
我已经尝试了我能找到的每一个连接,看看它是否会返回期望的结果,但似乎没有
下面是一个编译但不启用操作重命名选择
的示例。我们正在将文件名导入QListWidget。在本例中,我们可以在使用“打开”文件夹后启用它,但对于我的代码来说,这并不容易
导入系统
从操作系统导入listdir
从os.path导入isfile,加入
从PyQt5.QtWidgets导入(
QMainWindow、QAction、QHBoxLayout、QWidget、QListWidget、,
QListWidgetItem、QAbstractItemView、QApplication、QDialog、qApp、QToolBar、QFileDialog
)
从PyQt5.QtGui导入QIcon
从PyQt5导入QtCore
类MainGui(QMainWindow):
定义初始化(自):
super()。\uuuu init\uuuuu()
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)
#导入文件夹
self.importAct=QAction(QIcon('img/folder.svg'),'openfolder',self)
self.importAct.setShortcut('Ctrl+N')
self.importAct.triggered.connect(self.getFolder)
#重命名按钮
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.leftToolbar区域,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.ImportFolder=QFileDialog.getExistingDirectory(无,“选择目录”)
self.getFilesInDir(self.ImportFolder)
def GetFileIndir(self,mypath):
f=[]
files=[f表示listdir(mypath)中的f,如果isfile(join(mypath,f))]
如果文件:
self.listWidget.addItems(文件)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
app=QApplication(sys.argv)
gui=MainGui()
sys.exit(app.exec_())
如果您想知道某个项目是添加到QListWidget还是删除到QListWidget,则必须通过内部模型来完成,该模型分别具有
行插入信号和行删除信号
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)#任何时候添加元素都可以运行函数
self.lwModel.rowsRemoved.connect(self.checkListLength)#在删除元素时运行函数
我希望这能帮助任何有同样问题的人。真的帮助了我的项目!出于某种原因,每当我尝试在每次插入内容时滚动到列表小部件的底部时,它都无法工作。不过,使用这种方法很有魅力!荣誉