Python QTablewidget不';t在PyQt5中显示新的CellWidget

Python QTablewidget不';t在PyQt5中显示新的CellWidget,python,python-3.x,pyqt,pyqt5,qtablewidget,Python,Python 3.x,Pyqt,Pyqt5,Qtablewidget,我的程序是用Python3.5和PyQt5编写的。我的类中有一个方法,可以将一些自定义小部件添加到QTableWidget。当我从类内部调用函数时,它工作并更改QTablewidget的CellWidget,但当我从另一个自定义类调用它时,它不会更改小部件。我检查了,项目和索引都改变了,但是新的cellwidgets没有显示出来。有什么问题? 这是我的代码: class mainmenupage(QWidget): elist = [] def __init__(self):

我的程序是用Python3.5和PyQt5编写的。我的类中有一个方法,可以将一些自定义小部件添加到QTableWidget。当我从类内部调用函数时,它工作并更改QTablewidget的CellWidget,但当我从另一个自定义类调用它时,它不会更改小部件。我检查了,项目和索引都改变了,但是新的cellwidgets没有显示出来。有什么问题? 这是我的代码:

class mainmenupage(QWidget):
    elist = []
    def __init__(self):
        #the main window widget features
        self.setObjectName("mainpage")
        self.resize(800, 480)
        sizePolicy = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.sizePolicy().hasHeightForWidth())
        self.setSizePolicy(sizePolicy)
        self.setMinimumSize(QSize(800, 480))
        self.setMaximumSize(QSize(800, 480))

        #the QTreeWidget features
        self.category_tree = QTreeWidget(self)
        self.category_tree.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        self.category_tree.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        self.category_tree.setGeometry(QRect(630, 90, 161, 381))
        self.category_tree.setLayoutDirection(Qt.RightToLeft)
        self.category_tree.setLocale(QLocale(QLocale.Persian, QLocale.Iran))
        self.category_tree.setEditTriggers(QAbstractItemView.NoEditTriggers)
        self.category_tree.setUniformRowHeights(False)
        self.category_tree.setColumnCount(1)
        self.category_tree.setObjectName("category_tree")
        self.category_tree.headerItem().setText(0, "1")
        self.category_tree.setFrameShape(QFrame.NoFrame)
        self.category_tree.header().setVisible(False)
        self.category_tree.header().setSortIndicatorShown(False)
        self.category_tree.setFocusPolicy(Qt.NoFocus))

        #the QTableWidget features. It comes from the custom class myTableWidget
        self.main_table = myTableWidget(self)
        self.main_table.setGeometry(QRect(20, 140, 600, 330))
        sizePolicy = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.main_table.sizePolicy().hasHeightForWidth())
        self.main_table.setSizePolicy(sizePolicy)
        self.main_table.setMinimumSize(QSize(0, 0))
        self.main_table.setLayoutDirection(Qt.LeftToRight)
        self.main_table.setLocale(QLocale(QLocale.Persian, QLocale.Iran))
        self.main_table.setInputMethodHints(Qt.ImhNone)
        self.main_table.setFrameShape(QFrame.NoFrame)
        self.main_table.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        self.main_table.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        self.main_table.setEditTriggers(QAbstractItemView.NoEditTriggers)
        self.main_table.setTabKeyNavigation(False)
        self.main_table.setShowGrid(False)
        self.main_table.setCornerButtonEnabled(False)
        self.main_table.setUpdatesEnabled(True)

        self.main_table.setRowCount(2)
        self.main_table.setColumnCount(2)

        self.main_table.setObjectName("main_table")
        self.main_table.horizontalHeader().setVisible(False)
        self.main_table.horizontalHeader().setHighlightSections(False)
        self.main_table.verticalHeader().setVisible(False)
        self.main_table.verticalHeader().setHighlightSections(False)
        self.main_table.setFocusPolicy(Qt.NoFocus)
        self.main_table.setSelectionMode(QAbstractItemView.NoSelection)


        self.main_table.horizontalHeader().setDefaultSectionSize(300)
        self.main_table.verticalHeader().setDefaultSectionSize(165)

        self.category_tree.itemPressed.connect(self.insertdata)

    def insertdata(self,subcat):
        #get the text of clicked item from qtreewidget
        item = self.category_tree.currentItem().text(0)
        #get data from DB
        datas = self.conn.retrievedata('*','words',"subcat='{}'".format(item))
        #check if the list of copied data is empty or not
        if mainmenupage.elist != []:
            del mainmenupage.elist[:]
        #if the list is empty, the data received from DB appends to it
        if mainmenupage.elist == []:
            for data in datas:
                mainmenupage.elist.append(data)
            #delete the first index of copied list because it isn't needed here
            mainmenupage.elist = mainmenupage.elist[1:]
        # calls the populatemain function for populating qtablewidget with these datas with a custom index e.g. index 5 to 9.
        self.populatemain(5,9)

    def populatemain(self,startindexdata,endindexdata):
        #make a list for indexes of items that will be added to qtablewidget
        mtl=[]
        for i in range(2):
            for j in range(2):
                mtl.append(i)
                mtl.append(j)
        #adding custom widgets as cellWidgets to qtablewidget
        for index, my in enumerate(zip(*[iter(mtl)]*2)):
            if mainmenupage.elist != []:
                data = mainmenupage.elist[startindexdata:endindexdata][index]

                exec("self.iteM{} = CustomWidget('{}','content/img/food.png')".format(data[0],data[4]))
                exec("self.main_table.setCellWidget({} ,{}, self.iteM{})".format(*my,data[0]))


class myTableWidget(QTableWidget):
    def checking(self):
        if (self.endgingposx - self.startingposx) <= -50:
        #a custom function for checking that if the user made a swipe to left on the qtablewidget for chaning it's content
            if mainmenupage.elist != []:
                #make an instance from the previous class for accessing to populatemain method
                x = mainmenupage()
                #calling populatemain method for changing widgets in qtablewidget with the items made from different indexes of the copied data list e.g. indexes 0 to 4. but i don't know why this doesn't change the items. The populatemain function runs correctly it can be checked by putting print statement in it but it doesn't change the Qtablewidget contents.
                x.populatemain(0,4)
    def mousePressEvent(self,event):
        super().mousePressEvent(event)
        self.startingposx = event.x()
    def mouseReleaseEvent(self,event):
        super().mouseReleaseEvent(event)
        self.endgingposx = event.x()
        self.checking()

class CustomWidget(QWidget):
     def __init__(self, text, img, parent=None):
        QWidget.__init__(self, parent)

        self._text = text
        self._img = img

        self.setLayout(QVBoxLayout())
        self.lbPixmap = QLabel(self)
        self.lbText = QLabel(self)
        self.lbText.setAlignment(Qt.AlignCenter)

        self.layout().addWidget(self.lbPixmap)
        self.layout().addWidget(self.lbText)

        self.initUi()

    def initUi(self):
         self.lbPixmap.setPixmap(QPixmap(self._img).scaled(260,135,Qt.IgnoreAspectRatio,transformMode = Qt.SmoothTransformation))
        self.lbText.setText(self._text)


    @pyqtProperty(str)
    def img(self):
        return self._img

    @img.setter
    def total(self, value):
        if self._img == value:
            return
        self._img = value
        self.initUi()

    @pyqtProperty(str)
    def text(self):
        return self._text

    @text.setter
    def text(self, value):
        if self._text == value:
            return
        self._text = value
        self.initUi()
class mainmenupage(QWidget):
elist=[]
定义初始化(自):
#主窗口小部件的功能
self.setObjectName(“主页”)
自我调整大小(800480)
sizePolicy=QSizePolicy(QSizePolicy.Fixed,QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.sizePolicy().hasHeightForWidth())
self.setSizePolicy(sizePolicy)
自设置最小尺寸(QSize(800480))
self.setMaximumSize(QSize(800480))
#QTreeWidget的特性
self.category_tree=QTreeWidget(self)
self.category_tree.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.category_tree.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
自我分类树集合几何(QRect(63090161381))
self.category_tree.setLayoutDirection(Qt.rightoleft)
self.category_tree.setLocale(QLocale(QLocale.波斯语,QLocale.Iran))
self.category_tree.setEditTriggers(QAbstractItemView.NoEditTriggers)
self.category_tree.setUniformRowHeights(False)
self.category_tree.setColumnCount(1)
self.category\u tree.setObjectName(“category\u tree”)
self.category_tree.headerItem().setText(0,“1”)
self.category_tree.setFrameShape(QFrame.NoFrame)
self.category_tree.header().setVisible(False)
self.category_tree.header().setSortIndicatorShown(False)
self.category_tree.setFocusPolicy(Qt.NoFocus))
#QTableWidget具有以下功能。它来自自定义类myTableWidget
self.main_table=myTableWidget(self)
自身主表设置几何(QRect(20、140、600、330))
sizePolicy=QSizePolicy(QSizePolicy.Fixed,QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.main_table.sizePolicy().hasHeightForWidth())
self.main_table.setSizePolicy(sizePolicy)
self.main_table.setMinimumSize(QSize(0,0))
self.main_table.setLayoutDirection(Qt.LeftToRight)
self.main_table.setLocale(QLocale(QLocale.波斯语,QLocale.Iran))
self.main_table.setInputMethodHitts(Qt.ImhNone)
self.main_table.setFrameShape(QFrame.NoFrame)
self.main_table.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.main_table.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.main_table.setEditTriggers(QAbstractItemView.NoEditTriggers)
self.main_table.setTabKeyNavigation(False)
self.main_table.setShowGrid(假)
self.main_table.setCornerButtonEnabled(假)
self.main_table.setUpdatesEnabled(True)
self.main_table.setRowCount(2)
self.main_table.setColumnCount(2)
self.main_table.setObjectName(“main_table”)
self.main_table.horizontalHeader().setVisible(False)
self.main_table.horizontalHeader().setHighlightSections(False)
self.main_table.verticalHeader().setVisible(False)
self.main_table.verticalHeader().setHighlightSections(False)
self.main_table.setFocusPolicy(Qt.NoFocus)
self.main_table.setSelectionMode(QAbstractItemView.NoSelection)
self.main_table.horizontalHeader().setDefaultSectionSize(300)
self.main_table.verticalHeader().setDefaultSectionSize(165)
self.category\u tree.itemPressed.connect(self.insertdata)
def insertdata(自身、子类别):
#从qtreewidget获取已单击项的文本
item=self.category\u tree.currentItem().text(0)
#从数据库获取数据
datas=self.conn.retrievedata('*','words','subcat='{}'.format(item))
#检查复制的数据列表是否为空
如果mainmenupage.elist!=[]:
del mainmenuupage.elist[:]
#如果列表为空,则从DB接收的数据将附加到该列表
如果mainmenupage.elist=[]:
对于数据中的数据:
mainmenuupage.elist.append(数据)
#删除复制列表的第一个索引,因为此处不需要它
mainmenupage.elist=mainmenupage.elist[1:]
#调用populatemain函数,用自定义索引(例如索引5到9)将这些数据填充到qtablewidget中。
自我传播主体(5,9)
def populatemain(自、开始索引数据、结束索引扩展数据):
#为将添加到qtablewidget的项目的索引创建一个列表
mtl=[]
对于范围(2)中的i:
对于范围(2)内的j:
mtl.append(一)
mtl.append(j)
#将自定义小部件作为CellWidget添加到qtablewidget
对于索引,我在枚举(zip(*[iter(mtl)]*2)):
如果mainmenupage.elist!=[]:
data=mainmenupage.elist[startindexdata:endindexdata][index]
exec(“self.iteM{}=CustomWidget({},'content/img/food.png')”。格式(数据[0],数据[4]))
exec(“self.main_table.setCellWidget({},{},self.iteM{})”.format(*my,data[0]))
类myTableWidget(QTableWidget):
def检查(自我):

如果(self.endgingposx-self.startingposx)经过大量的努力,我最终以这种方式解决了我的问题: 我制作了一个Qframe并将QTableWidget放入其中,然后编辑了QTableWidget的mousePressEvent以调用Qframe的mousePressEvent,该Qframe位于该表的下方,然后简单地检查单击的开始和结束位置,并制作了一个函数,在发生滑动时更新QTableWidget的内容。我发布这个是为了帮助任何人