Qt 프로그래밍에 초보자입니다. 단추를 클릭하여 행을 추가 할 수있는 간단한 테이블을 만들려고합니다. 나는 테이블을 잘 구현할 수 있지만 테이블에 표시 할 업데이트 된 데이터를 가져올 수 없습니다. 내 문제는 단추를 사용하여 모든 종류의 "데이터 변경"메서드를 제대로 호출 할 수 없다는 사실에서 기인한다고 생각합니다. 나는 여러 가지 솔루션을 온라인으로 시도해 왔으며 그 중 4 년이 된 모든 막 다른 게시물이 있습니다. 지금까지 가지고있는 기본 구조는 새 데이터로 테이블을 업데이트하는 방법을 파악할 수 없습니다.PyQt : QAbstractTableModel을 사용하여 QTableView에 행 추가
이것은 내가 몇 가지 테스트 데이터와 설정 한 기본보기
입니다.
최종 구현에서 테이블이 비어있을 것이므로 행을 추가하고 테이블보기에 표시하려고합니다.
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
class MyWindow(QWidget):
def __init__(self):
QWidget.__init__(self)
# create table
self.get_table_data()
self.table = self.createTable()
# layout
self.layout = QVBoxLayout()
self.testButton = QPushButton("test")
self.connect(self.testButton, SIGNAL("released()"), self.test)
self.layout.addWidget(self.testButton)
self.layout.addWidget(self.table)
self.setLayout(self.layout)
def get_table_data(self):
self.tabledata = [[1234567890,2,3,4,5],
[6,7,8,9,10],
[11,12,13,14,15],
[16,17,18,19,20]]
def createTable(self):
# create the view
tv = QTableView()
# set the table model
header = ['col_0', 'col_1', 'col_2', 'col_3', 'col_4']
tablemodel = MyTableModel(self.tabledata, header, self)
tv.setModel(tablemodel)
# set the minimum size
tv.setMinimumSize(400, 300)
# hide grid
tv.setShowGrid(False)
# hide vertical header
vh = tv.verticalHeader()
vh.setVisible(False)
# set horizontal header properties
hh = tv.horizontalHeader()
hh.setStretchLastSection(True)
# set column width to fit contents
tv.resizeColumnsToContents()
# set row height
tv.resizeRowsToContents()
# enable sorting
tv.setSortingEnabled(False)
return tv
def test(self):
self.tabledata.append([1,1,1,1,1])
self.emit(SIGNAL('dataChanged()'))
print 'success'
class MyTableModel(QAbstractTableModel):
def __init__(self, datain, headerdata, parent=None):
"""
Args:
datain: a list of lists\n
headerdata: a list of strings
"""
QAbstractTableModel.__init__(self, parent)
self.arraydata = datain
self.headerdata = headerdata
def rowCount(self, parent):
return len(self.arraydata)
def columnCount(self, parent):
if len(self.arraydata) > 0:
return len(self.arraydata[0])
return 0
def data(self, index, role):
if not index.isValid():
return QVariant()
elif role != Qt.DisplayRole:
return QVariant()
return QVariant(self.arraydata[index.row()][index.column()])
def setData(self, index, value, role):
pass # not sure what to put here
def headerData(self, col, orientation, role):
if orientation == Qt.Horizontal and role == Qt.DisplayRole:
return QVariant(self.headerdata[col])
return QVariant()
def sort(self, Ncol, order):
"""
Sort table by given column number.
"""
self.emit(SIGNAL("layoutAboutToBeChanged()"))
self.arraydata = sorted(self.arraydata, key=operator.itemgetter(Ncol))
if order == Qt.DescendingOrder:
self.arraydata.reverse()
self.emit(SIGNAL("layoutChanged()"))
if __name__ == "__main__":
app = QApplication(sys.argv)
w = MyWindow()
w.show()
sys.exit(app.exec_())
샘플 코드 주셔서 감사합니다 :
그래서 그냥 이런 식으로 뭔가를 필요로한다! 대단히 도움이된다! – Hephaestus
동의 귀하의 질문에있는 코드 샘플은 다른 많은 질문에 대한 답변입니다. –