向下滚动后,可检查的QComboBox将丢失一些项目

2024-10-05 12:51:21 发布

您现在位置:Python中文网/ 问答频道 /正文

有一个用python编写的可检查QComboBox。但是在我向下滚动项目(不要向后滚动!)并打包下拉区域并再次向下滚动后,一些项目将消失!我的PyQt版本是5.15.0

enter image description hereenter image description hereenter image description hereenter image description here

这是密码。复制并运行,您将发现这种现象。我认为这可能是QListWidget的一个bug,但没有发现有人问过它

from PyQt5.QtWidgets import QComboBox,QLineEdit,QListWidget,QCheckBox,QListWidgetItem,QApplication, QLabel, QMainWindow
import sys

list_=["1","2","3","4","5","6","7","8","9","10","11"]#

class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.resize(320, 100)
        self.setWindowTitle("aaaa")
        self.setStyleSheet(
            """
            QMainWindow
            {
                background-color:white;
                color:white;
                margin:0px
            }
            """
        )
        self.InitializeWindow()
        self.i = 0

    def InitializeWindow(self):
        comb=ComboCheckBox(list_, self)
        comb.show()
        pass


class ComboCheckBox(QComboBox):
    def __init__(self,items, parent):#items==[str,str...]
        super(ComboCheckBox,self).__init__(parent)
        self.items=items
        self.items.insert(0,'all')
        self.row_num=len(self.items)
        self.Selectedrow_num=0
        self.qCheckBox=[]
        self.qLineEdit=QLineEdit()
        self.qLineEdit.setReadOnly(True)
        self.qListWidget=QListWidget()
        self.addQCheckBox(0)
        self.qCheckBox[0].stateChanged.connect(self.All)
        for i in range(1,self.row_num):
            self.addQCheckBox(i)
            self.qCheckBox[i].stateChanged.connect(self.show)
        self.setModel(self.qListWidget.model())
        self.setView(self.qListWidget)
        self.setLineEdit(self.qLineEdit)         
 
    def addQCheckBox(self,i):
        self.qCheckBox.append(QCheckBox())
        qItem=QListWidgetItem(self.qListWidget)
        self.qCheckBox[i].setText(self.items[i])
        self.qListWidget.setItemWidget(qItem,self.qCheckBox[i])        
 
    def Selectlist(self):
        Outputlist=[]
        for i in range(1,self.row_num):
            if self.qCheckBox[i].isChecked()==True:
                Outputlist.append(self.qCheckBox[i].text())
        self.Selectedrow_num=len(Outputlist)
        return Outputlist 
 
    def show(self):
        show=''
        Outputlist=self.Selectlist()
        self.qLineEdit.setReadOnly(False)
        self.qLineEdit.clear()
        for i in Outputlist:
            show+=i+';'
        if self.Selectedrow_num==0:
            self.qCheckBox[0].setCheckState(0)
        elif self.Selectedrow_num==self.row_num-1:
            self.qCheckBox[0].setCheckState(2)
        else:
            self.qCheckBox[0].setCheckState(1)
        self.qLineEdit.setText(show)
        self.qLineEdit.setReadOnly(True)
 
    def All(self,status_):
        if status_==2:
            for i in range(1,self.row_num):
                self.qCheckBox[i].setChecked(True)
        elif status_==1:
            if self.Selectedrow_num==0:
                self.qCheckBox[0].setCheckState(2)
        elif status_==0:
            self.clear()
 
    def clear(self):
        for i in range(self.row_num):
            self.qCheckBox[i].setChecked(False)

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

Tags: inselfforifinitdefshowitems

热门问题