2017-09-05 8 views
1

내 프로그램은 Python3.5 및 PyQt5로 작성되었습니다. 클래스에 QTableWidget에 일부 맞춤 위젯을 추가하는 메소드가 있습니다. 클래스 내부에서 함수를 호출하면 작동하고 QTablewidget의 셀 위젯을 변경하지만 다른 사용자 정의 클래스에서 호출하면 위젯이 변경되지 않습니다. 확인했는데 항목과 색인이 변경되었지만 새 셀 위젯은 표시되지 않습니다. 문제가 무엇입니까? 이 내 코드입니다 :QTablewidget이 PyQt5에 새 cellWidget을 표시하지 않습니다.

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() 

self.category_tree가 QTreeWidget

self.main_table 내 질문을 완료를 들어 QTableWidget

입니다. self.category_tree items 중 하나를 클릭하면 insertdata이 호출됩니다. insertdata의 마지막 줄에 self.populatemain(5,9)을 호출하면 내 테이블에 사용자 정의 위젯 4 개가 추가되지만 myTableWidget 클래스의 checking 메서드는 populatemain 클래스를 호출하면 qtablewidget 항목이 변경되지 않습니다. 뭐가 문제 야? 미리 감사드립니다. 많은 노력이 마침내 나는 내 문제 해결이 방법 후

+0

코드를 디버그하기는 어렵지만 일반적인 초보자 오류는 열과 행의 수를 설정하지 않는다는 것입니다. 즉 위젯을 위치 i, j에 삽입하려면이 위치가 있어야하므로 귀하의 경우 위젯을 추가하기 전에 다음 코드'self.main_table.setRowCount (2) self.main_table.setColumnCount (2)'를 사용하여 행과 열의 수를 늘려야합니다. – eyllanesc

+0

네,이 코드가 맞습니다. '# 일부 코드 '부분에서는 이미이 두 줄을 썼습니다. 그리고 그 때문에 당신이 항목을 테이블에 올 때 항목이 표 시되 고 메인 항목의 채우기가 두 번 발생한다고 말한 것을 볼 수 있습니다. 하지만 그 기능이 해당 검사 기능에 의해 호출되는 시간이 새 항목을 표시하지 않는 이유는 모르겠습니다. @eyllanesc – Nimda

+0

현재 코드를 실행할 수 없기 때문에 테스트 할 수있는 코드를 표시하지 않으면 더 이상 제안 할 수 없습니다. 코드가 광범위하면 Dropbox, 드라이브 등이 공유 할 수 있습니다. – eyllanesc

답변

0

: 은 내가 Qframe를 만들어 그 안에 QTableWidget을 퍼트하고 난 QTableWidget의 mousePressEvent이 테이블 경우 아래에있는 QFrame의 mousePressEvent 전화를 편집 해 , 그리고 단순히 클릭의 시작과 끝 위치를 확인하고 스 와이프가 발생했을 때 QTableWidget의 내용을 업데이트하는 함수를 만들었습니다. 나는이 같은 문제에가는 다른 누군가를 돕기 위해 이것을 올렸다.