Search code examples
python-3.xpyqt5qtablewidgetqplaintextedit

How to remove exact text from QPlaintextEdit from Qlistidget if unchecked item?


I want to remove exact match text from the QPlaintextEdit from Qlistwidget when unchecking the item. it is removing the items but also removing other matched text. for e.g: There are "Fname1 Lname1", "Fname2 Lname2", "Fname3 LName3", "Fname", "Lname1. I selected all items and i want to romove a item with unchecked item "Fname". its removing the individual "Fname" and also removing "Fname" in "Fname1 Lname1" and giving output as "1 Lname1". I want to remove only exact item(Text). How to do? Below is my example code:

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(691, 327)
        self.listWidget = QtWidgets.QListWidget(Form)
        self.listWidget.setGeometry(QtCore.QRect(70, 40, 256, 192))
        self.listWidget.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
        self.listWidget.setObjectName("listWidget")
        self.plainTextEdit = QtWidgets.QPlainTextEdit(Form)
        self.plainTextEdit.setGeometry(QtCore.QRect(360, 40, 261, 191))
        self.plainTextEdit.setTabChangesFocus(True)
        self.plainTextEdit.setReadOnly(True)
        self.plainTextEdit.setObjectName("plainTextEdit")

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)
          
    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Form"))


class MainWindow(QtWidgets.QWidget, Ui_Form):                             
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        
        self.lists = {
            "Fname1 Lname1": 0, 
            "Fname2 Lname2": 0, 
            "Fname3 LName3": 0,
            "Fname":0,
            "lname1":0
        }  

        for i in self.lists.keys():                                   
            item = QtWidgets.QListWidgetItem(i)
            item.setFlags(item.flags() | QtCore.Qt.ItemIsUserCheckable)
            item.setCheckState(QtCore.Qt.Unchecked)
            self.listWidget.addItem(item)
           


    def on_listWidget_itemClicked(self, item):    

        if item.checkState() == QtCore.Qt.Checked and self.lists[item.text()] == 0:
            self.plainTextEdit.appendPlainText(item.text())
            self.lists[item.text()] = 1                                  
        elif item.checkState() == QtCore.Qt.Unchecked:
            text = self.plainTextEdit.toPlainText()
            text = text.replace(item.text(), '')
         
            _list = text.split('\n')                                   
            _list = [ i for i in _list if i ]                           
            text = '\n'.join(_list)              
            self.plainTextEdit.setPlainText(text)   
            self.lists[item.text()] = 0     


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    Form = MainWindow() 
    Form.show()
    sys.exit(app.exec_())

Solution

  • Try it:

    from PyQt5 import QtCore, QtGui, QtWidgets
    
    
    class Ui_Form(object):
        def setupUi(self, Form):
            Form.setObjectName("Form")
            Form.resize(691, 327)
            self.listWidget = QtWidgets.QListWidget(Form)
            self.listWidget.setGeometry(QtCore.QRect(70, 40, 256, 192))
            self.listWidget.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
            self.listWidget.setObjectName("listWidget")
            self.plainTextEdit = QtWidgets.QPlainTextEdit(Form)
            self.plainTextEdit.setGeometry(QtCore.QRect(360, 40, 261, 191))
            self.plainTextEdit.setTabChangesFocus(True)
            self.plainTextEdit.setReadOnly(True)
            self.plainTextEdit.setObjectName("plainTextEdit")
    
            self.retranslateUi(Form)
            QtCore.QMetaObject.connectSlotsByName(Form)
              
        def retranslateUi(self, Form):
            _translate = QtCore.QCoreApplication.translate
            Form.setWindowTitle(_translate("Form", "Form"))
    
    
    class MainWindow(QtWidgets.QWidget, Ui_Form):                             
        def __init__(self):
            super().__init__()
            self.setupUi(self)
            
            self.lists = {
                "Fname1 Lname1": 0, 
                "Fname2 Lname2": 0, 
                "Fname3 LName3": 0,
                "Fname":0,
                "lname1":0
            }  
    
            for i in self.lists.keys():                                   
                item = QtWidgets.QListWidgetItem(i)
                item.setFlags(item.flags() | QtCore.Qt.ItemIsUserCheckable)
                item.setCheckState(QtCore.Qt.Unchecked)
                self.listWidget.addItem(item)
    
        def on_listWidget_itemClicked(self, item):    
    
            if item.checkState() == QtCore.Qt.Checked and self.lists[item.text()] == 0:
                self.plainTextEdit.appendPlainText(item.text())
                self.lists[item.text()] = 1                                  
            elif item.checkState() == QtCore.Qt.Unchecked:
                text = self.plainTextEdit.toPlainText()
                
    #            text = text.replace(item.text(), '')                         # ---
              
                _list = text.split('\n')                                   
    #            _list = [ i for i in _list if i ]                            # --- 
                _list = [ i for i in _list if i != item.text() ]              # +++  
    
                
                text = '\n'.join(_list)              
                self.plainTextEdit.setPlainText(text)   
                self.lists[item.text()] = 0     
    
    
    if __name__ == "__main__":
        import sys
        app = QtWidgets.QApplication(sys.argv)
        Form = MainWindow() 
        Form.show()
        sys.exit(app.exec_())