0

I am using QListWidget, QSqlTableModel, QtableView and QDataWidgetMapper. QListWidget is ItemIsUserCheckable. I am able to save selected items from QListWidget into QtSql table in a single field as string format(converting list items into string as "Green, Green Grapes, Oranges". But at the same time i want to change the selected item and update the items from QListWidget of the String data. How to do. Is it possible. Or PLease let me know if any other solution. Below is the Example code:

from PyQt5 import QtCore, QtGui, QtWidgets, QtSql
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtSql import *


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(391, 496)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.listWidget = QtWidgets.QListWidget(self.centralwidget)
        self.listWidget.setGeometry(QtCore.QRect(9, 9, 373, 188))
        self.listWidget.setObjectName("listWidget")
        self.save_btn = QtWidgets.QPushButton(self.centralwidget)
        self.save_btn.setGeometry(QtCore.QRect(100, 230, 75, 23))
        self.save_btn.setObjectName("save_btn")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(9, 203, 27, 16))
        self.label.setObjectName("label")
        self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit.setGeometry(QtCore.QRect(56, 203, 181, 20))
        self.lineEdit.setObjectName("lineEdit")
        self.update_btn = QtWidgets.QPushButton(self.centralwidget)
        self.update_btn.setGeometry(QtCore.QRect(293, 229, 75, 23))
        self.update_btn.setObjectName("update_btn")
        self.edit_btn = QtWidgets.QPushButton(self.centralwidget)
        self.edit_btn.setGeometry(QtCore.QRect(199, 229, 75, 23))
        self.edit_btn.setObjectName("edit_btn")
        self.tableView = QtWidgets.QTableView(self.centralwidget)
        self.tableView.setGeometry(QtCore.QRect(9, 258, 373, 188))
        self.tableView.setObjectName("tableView")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 391, 21))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

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

        db = QtSql.QSqlDatabase.addDatabase("QSQLITE")
        db.setDatabaseName("fruites.db")
        if db.open():
            if db.open():
                query = QSqlQuery()
                query.exec_("""CREATE TABLE IF NOT EXISTS store(name TEXT, items TEXT)""")

        self.store_model = QtSql.QSqlTableModel()
        self.store_model.setTable("store")
        self.store_model.select()
        self.tableView.setModel(self.store_model)

        list_ = ["Green", "Green Apple","Green Grapes", "Bananas", "Oranges"]
        list_ = dict.fromkeys(list_, 0)
        for i in list_:
            item = QtWidgets.QListWidgetItem(i)
            item.setFlags(item.flags() | QtCore.Qt.ItemIsUserCheckable)
            item.setCheckState(QtCore.Qt.Unchecked)
            self.listWidget.addItem(item)

        self.save_btn.clicked.connect(self.save_item)
        self.edit_btn.clicked.connect(self.edit_item)
        self.update_btn.clicked.connect(self.submit_item)


    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.save_btn.setText(_translate("MainWindow", "Save"))
        self.label.setText(_translate("MainWindow", "Name"))
        self.update_btn.setText(_translate("MainWindow", "Update"))
        self.edit_btn.setText(_translate("MainWindow", "Edit"))

    def save_item(self):
        name = self.lineEdit.text()
        strng = ''
        checked = []
        for row in range(self.listWidget.count()):
            item = self.listWidget.item(row)
            if item.checkState():
                checked.append(item)
        strng = ", " .join(i.text() for i in checked)

        r = self.store_model.record()
        r.setValue("name", name)
        r.setValue("items", strng)
        self.store_model.insertRecord(-1, r)

        self.store_model.select()
        self.lineEdit.clear()
        for i in range(self.listWidget.count()):
            item = self.listWidget.item(i)
            item.setCheckState(QtCore.Qt.Unchecked)

    def edit_item(self):
        selected = self.tableView.selectedIndexes()
        if not self.store_model.rowCount():
            return
        index = self.tableView.currentIndex()
        if index.isValid():
            row = index.row()
        else:
            row = 0

        self.store_mapper = QtWidgets.QDataWidgetMapper()
        self.store_mapper.setSubmitPolicy(QtWidgets.QDataWidgetMapper.ManualSubmit)
        self.store_mapper.setModel(self.tableView.model())

        self.store_mapper.addMapping(self.lineEdit, 0)
        self.store_mapper.addMapping(self.listWidget, 1)

        self.store_mapper.setCurrentIndex(row)

    def submit_item(self):
        self.store_mapper.submit()
        self.lineEdit.clear()

        
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_())
user3030327
  • 411
  • 1
  • 7
  • 19
  • Why don't you store your items as single elements in your SQL database? Not only it would be more efficient but it will allow you to easyly do what you want. That doesn't mean that once you retrieve the data from your database you cannot display it all together if you wanted to... – Isma Sep 19 '20 at 17:15
  • @Isma. How to store as Single elements. Can you give me any Example. – user3030327 Sep 19 '20 at 17:27
  • @Isma Can you help me on this. – user3030327 Sep 21 '20 at 05:10

0 Answers0