PyQt5 удаляет QListWidgets и QPushButton динамически и взаимодействует с listItems - PullRequest
1 голос
/ 11 апреля 2020

В моем приложении QApplication я хочу динамически создавать QListWidgets и что-то делать со списочными элементами. Я хочу создать любимую вкладку. Единственная мысль, что работа - это self.listWidget_fav.clear

Есть 4 QPushButtons

  1. кнопка self.buttonOK должна использовать элементы списка
  2. self. buttonRemoveFav должен удалить весь QListWidget с помощью 4 QPushButtons
  3. , self.buttonDel должен очистить весь список <---- working </li>
  4. , self.buttonDelSel должен удалить выбранный listItem.

Что не так?

import sys, time, names
from PyQt5 import QtCore
from PyQt5.QtCore import QAbstractTableModel, Qt
from PyQt5.QtWidgets import *
from functools import partial
import names

colPos = 0

class MainWindow(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)

        self.resize(800, 600)        

        self.tabs = QTabWidget()
        self.tabs.layout = QGridLayout() 
        self.tabs.setLayout(self.tabs.layout)

        self.grid = QGridLayout()
        self.grid.addWidget(self.tabs)
        self.setLayout(self.grid)
        self.setCentralWidget(self.tabs)  

        self.result = QTabWidget()
        self.result.layout = QGridLayout() 
        self.result.setLayout(self.result.layout)

        self.fav = QTabWidget()
        self.fav.layout = QGridLayout()
        self.fav.setLayout(self.fav.layout)

        self.tabs.addTab(self.result, 'Tab 1')      
        self.tabs.addTab(self.fav, 'Fav')

        #create space to put the export button in the bottom of the TableView
        positions = [(i,j) for i in range(20) for j in range(10)]
        lst = []
        for i in range(30):
            lst.append(names.get_full_name())

        print(lst)
        self.checkBoxes = [] 

        for position, no in zip(positions, lst): 
            self.checkB = QCheckBox(str(no), self)
            self.result.layout.addWidget(self.checkB, *position)
            self.checkBoxes.append(self.checkB)

        #select All     
        self.buttonSelAll = QPushButton("Select All", self)
        self.buttonSelAll.clicked.connect(partial(self.selectBoxes, True))
        self.result.layout.addWidget(self.buttonSelAll, 21, 0)

        #select All     
        self.buttonNone = QPushButton("Select None", self)
        self.buttonNone.clicked.connect(partial(self.selectBoxes, False))
        self.result.layout.addWidget(self.buttonNone, 21, 1)

        #select All     
        self.buttonFav = QPushButton("Fav", self)
        self.buttonFav.clicked.connect(self.toFav)
        self.result.layout.addWidget(self.buttonFav, 21, 3)

        self.checkBtext = [] # var for text of checkboxes.
        for i in range(len(self.checkBoxes)):
            self.checkBtext.append(self.checkBoxes[i].text())

        self.res = {}     

    def resetColPos(self):
        global colPos
        colPos = colPos - 2
        self.listWidget_fav.hide()
        self.buttonOK.hide()
        self.buttonDel.hide() 
        self.buttonDelSel.hide() 
        self.buttonRemoveFav.hide()

    def removeSelfromFav(self):
        listItems = self.listWidget_fav.selectedItems()
        if not listItems: return        
        for item in listItems:
            self.listWidget_fav.takeItem(self.listWidget_fav.row(item)) 

    def toFav(self):
        global colPos
        states = [c.isChecked() for c in self.checkBoxes]
        self.selectedChecktext = [] #Text of selected checkbox
        for key in self.checkBtext: 
            for value in states: 
                self.res[key] = value 
                states.remove(value)
                break

        print("self.res.items(): ", self.res.items())
        print(len(self.res))  
        for k, v in self.res.items():
            if v == True and not k in self.selectedChecktext:
                self.selectedChecktext.append(k)
            elif v == False and k in self.selectedChecktext:
                self.selectedChecktext.remove(k)
        print("self.selectedChecktext: ", self.selectedChecktext)

        self.listWidget_fav = QListWidget()     
        self.listWidget_fav.addItems(self.selectedChecktext)
        self.fav.layout.addWidget(self.listWidget_fav, 0, colPos, 5, 2)
        self.fav.setLayout(self.fav.layout)

        self.buttonOK = QPushButton("ok", self)
        self.fav.layout.addWidget(self.buttonOK, 6, colPos)
        self.fav.setLayout(self.fav.layout) 

        self.buttonRemoveFav = QPushButton("Remove Fav", self)
        self.buttonRemoveFav.clicked.connect(self.resetColPos)
        self.fav.layout.addWidget(self.buttonRemoveFav, 6, colPos+1)
        self.fav.setLayout(self.fav.layout) 

        self.buttonDel = QPushButton("Clear List", self)
        self.buttonDel.clicked.connect(self.listWidget_fav.clear)
        self.fav.layout.addWidget(self.buttonDel, 7, colPos)
        self.fav.setLayout(self.fav.layout)   

        self.buttonDelSel = QPushButton("Delete selected", self)
        self.fav.layout.addWidget(self.buttonDelSel, 7, colPos+1)
        self.fav.setLayout(self.fav.layout)

        colPos = colPos + 2

    def checkStates(self):
        states = [c.isChecked() for c in self.checkBoxes]
        print ("states: ", states)

    def selectBoxes(self, state):
        for check in self.checkBoxes:
            check.blockSignals(True)
            check.setChecked(state)
            check.blockSignals(False)
        self.checkStates()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    app.setStyle('Fusion')
    mw = MainWindow()
    mw.show()
    sys.exit(app.exec_())

names Пакет должен быть установлен через имена установки pip -m;)

...