簡體   English   中英

如何在 PyQt5 的 QlistWidget 中返回項目的值

[英]how to return the value of item in the QlistWidget in PyQt5

我在 PyQt5 中有一個 GUI 應用程序,它在 QlistWidget 中創建帶有復選框的顯示項目,其中用戶檢查項目並且系統打印檢查的值。

問題是當用戶檢查項目時,它會顯示以下錯誤:

  print([i.text() for i in self.checked])
AttributeError: 'str' object has no attribute 'text'

但是這一行print([i.text() for i in self.checked])僅在打印中打印值

這一行是錯誤:

self.checked = [i.text() for i in self.checked]

代碼:

from PyQt5 import QtCore, QtGui, QtWidgets

import os
import pandas as pd
import numpy as np

import chardet




class Ui_MainWindow(QtWidgets.QMainWindow):
    def setupUi(self, MainWindow):
        self.checked = []
        
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)

        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        
        self.header_list = QtWidgets.QListWidget(self.centralwidget)
        self.header_list.setMaximumSize(QtCore.QSize(120, 1667))
        self.header_list.setSelectionMode(QtWidgets.QAbstractItemView.MultiSelection)
        self.header_list.setObjectName("header_list")
        self.header_list.itemChanged.connect(self.selectionChanged)
        
        MainWindow.setCentralWidget(self.centralwidget)
        
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 22))
        self.menubar.setObjectName("menubar")

        self.menufile = self.menubar.addMenu("File")
        self.menufile.setObjectName("menufile")

        self.menuimportfile = QtWidgets.QAction("Import File",self.menufile)
        self.menuimportfile.setObjectName("importfile")
        self.menuimportfile.triggered.connect(lambda:self.loadFile())
        
        MainWindow.setMenuBar(self.menubar)
        
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        
        MainWindow.setStatusBar(self.statusbar)
        
        self.menufile.addAction(self.menuimportfile)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.menufile.setTitle(_translate("MainWindow", "file"))


    def loadFile(self):
        try:
            fileName, _ = QtWidgets.QFileDialog.getOpenFileName(self, "Open File", "", "Excel Files (*.csv *.xls *.xlsx)");
            print(fileName)            
            name, ext = os.path.splitext(fileName)
            print("name: {} ".format(name))
            print("ext:  {} ".format(ext))
            if ext == ".csv":
                with open(fileName, 'rb') as rawdata:
                    result = chardet.detect(rawdata.read(100000))
                print(result)
                df = pd.read_csv(fileName,encoding = result["encoding"])
            elif ext == ".xls" or ext == ".xlsx":
                df = pd.read_excel(fileName)
            self.df = df

            
        #part that display items in the qlistWidget
            self.header_list.clear()
            savelist = list(self.df)
            for item in savelist:
                qitem = QtWidgets.QListWidgetItem ( ) 
                qitem.setText ( item ) 
                qitem. setFlags ( QtCore. Qt . ItemIsUserCheckable | QtCore. Qt . ItemIsEnabled ) 
                qitem.setCheckState ( QtCore.Qt.Unchecked ) 
                self.header_list.addItem ( qitem )
        
        except Exception as e:
            print("error is {}".format(e))


    def selectionChanged(self, item):
        if item.checkState():
            if item not in self.checked:
                self.checked.append(item)
        elif item in self.checked:
            self.checked.remove(item)
        print([i.text() for i in self.checked])
        self.checked = [i.text() for i in self.checked]
        print(self.checked)
        


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())
  

問題很簡單,假設在變量“checked”中要保存已檢查的 QListWidgetItem。 讓我們通過一個例子來分析發生了什么:假設用戶選擇了第一個選項,然后“checked”最初將為空,因此選中的項目被比較並添加到列表中,但后來檢查的是 QListWidgetItem 的文本列表,這使邏輯變性。 因此,作為一個教訓,不要對多個事物使用相同的變量:

def selectionChanged(self, item):
    if item.checkState():
        if item not in self.checked:
            self.checked.append(item)
    elif item in self.checked:
        self.checked.remove(item)

    values = [i.text() for i in self.checked] print(values)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM