내 프로그램은 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 항목이 변경되지 않습니다. 뭐가 문제 야? 미리 감사드립니다. 많은 노력이 마침내 나는 내 문제 해결이 방법 후
코드를 디버그하기는 어렵지만 일반적인 초보자 오류는 열과 행의 수를 설정하지 않는다는 것입니다. 즉 위젯을 위치 i, j에 삽입하려면이 위치가 있어야하므로 귀하의 경우 위젯을 추가하기 전에 다음 코드'self.main_table.setRowCount (2) self.main_table.setColumnCount (2)'를 사용하여 행과 열의 수를 늘려야합니다. – eyllanesc
네,이 코드가 맞습니다. '# 일부 코드 '부분에서는 이미이 두 줄을 썼습니다. 그리고 그 때문에 당신이 항목을 테이블에 올 때 항목이 표 시되 고 메인 항목의 채우기가 두 번 발생한다고 말한 것을 볼 수 있습니다. 하지만 그 기능이 해당 검사 기능에 의해 호출되는 시간이 새 항목을 표시하지 않는 이유는 모르겠습니다. @eyllanesc – Nimda
현재 코드를 실행할 수 없기 때문에 테스트 할 수있는 코드를 표시하지 않으면 더 이상 제안 할 수 없습니다. 코드가 광범위하면 Dropbox, 드라이브 등이 공유 할 수 있습니다. – eyllanesc