问题描述
如何在QlistWidget中返回或打印所有选中的项目?
我能够打印选中的项目,但是我要打印的是选中的项目
所以我想检查是否选中了该项目,如果是,系统会将选中的项目附加到列表中,最后打印此列表。
代码:
from PyQt5 import QtCore,QtGui,QtWidgets
import pandas as pd
from PandasModel import PandasModel
import seaborn as sns
import cufflinks as cf
import plotly
import plotly.offline as py
import plotly.express as px
import plotly.graph_objs as go
from plotly.offline.offline import iplot
cf.go_offline()
cf.set_config_file(offline=False,world_readable=True)
class Widget(QtWidgets.QWidget):
def __init__(self,parent=None):
QtWidgets.QWidget.__init__(self,parent=None)
self.gridLayout_3 = QtWidgets.qgridLayout(self)
self.gridLayout_3.setobjectName("gridLayout_3")
self.gridLayout_2 = QtWidgets.qgridLayout()
self.gridLayout_2.setobjectName("gridLayout_2")
self.gridLayout = QtWidgets.qgridLayout()
self.gridLayout.setobjectName("gridLayout")
self.pathLE = QtWidgets.QLineEdit(self)
self.gridLayout_2.addWidget(self.pathLE,1,1)
self.loadBtn = QtWidgets.QPushButton("Select File",self)
self.loadBtn.clicked.connect(self.loadFile)
self.gridLayout_2.addWidget(self.loadBtn,1)
self.gridLayout_3.addLayout(self.gridLayout_2,4)
self.displayHeader = QtWidgets.QPushButton("display header",self)
self.displayHeader.clicked.connect(lambda: self.print_df_header(self.df))
self.gridLayout.addWidget(self.displayHeader,2,1)
self.displayDF_checked_header = QtWidgets.QPushButton("Print checked item",self)
self.displayDF_checked_header.clicked.connect(lambda: self.setItems(self.df))
self.gridLayout.addWidget(self.displayDF_checked_header,5,1)
self.header_list = QtWidgets.QListWidget(self)
self.header_list.setobjectName("listWidget")
self.header_list.itemSelectionChanged.connect(self.selectionChanged)
self.gridLayout_3.addWidget(self.header_list,1)
self.pandasTv = QtWidgets.QTableView(self)
self.verticalLayout.addWidget(self.pandasTv)
self.pandasTv.setSortingEnabled(True)
def loadFile(self):
fileName,_ = QtWidgets.QFileDialog.getopenFileName(self,"Open File","","CSV Files (*.csv)");
self.pathLE.setText(fileName)
df = pd.read_csv(fileName)
model = PandasModel(df)
self.pandasTv.setModel(model)
self.df = df
def print_df_header(self,df):
savelist = list(self.df)
for item in savelist:
qitem = QtWidgets.QListWidgetItem ( )
qitem.setText ( item )
qitem.setCheckState ( QtCore.Qt.Unchecked )
self.header_list.addItem ( qitem )
print(savelist)
def setItems(self,item):
self.items=[]
if item.checkState() == QtCore.Qt.Checked:
self.items.append(item)
print(self.items.append(item))
if item.checkState() == QtCore.Qt.Unchecked:
self.items.remove(item)
# this function allow to print the selected items
def selectionChanged(self):
print("Selected items: ",self.header_list.selectedItems())
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
w = Widget()
w.show()
sys.exit(app.exec_())
解决方法
您需要循环浏览所有项目并检查其checkState()
:
def selectionChanged(self):
checked = []
for row in range(self.header_list.count()):
item = self.header_list.item(row)
if item.checkState():
checked.append(item)
print("Checked items: ",",".join(i.text() for i in checked))