TableModel Class
QTDesigner에서 TableVirw 컨트롤을 디자인 한다.이는 Table로 표시하는 (GRID) 컨트롤이다.
이를 다루기 위해서는 TableModel Class가 필요 하다.
code:
class MyTableModel(QAbstractTableModel):
def __init__(self, parent, mylist, header, *args):
QAbstractTableModel.__init__(self, parent, *args)
self.mylist = mylist
self.header = header
def rowCount(self, parent):
return len(self.mylist)
def columnCount(self, parent):
#return len(self.mylist[0])
return len(self.header)
def data(self, index, role):
if not index.isValid():
return None
elif role != Qt.DisplayRole:
return None
return self.mylist[index.row()][index.column()]
def headerData(self, col, orientation, role):
if orientation == Qt.Horizontal and role == Qt.DisplayRole:
return self.header[col]
return None
def sort(self, col, order):
"""sort table by given column number col"""
self.emit(SIGNAL("layoutAboutToBeChanged()"))
self.mylist = sorted(self.mylist,
key=operator.itemgetter(col))
if order == Qt.DescendingOrder:
self.mylist.reverse()
self.emit(SIGNAL("layoutChanged()"))
위 코드는 일반적인 테이블뷰의 모델 클래스 이다.
list 형의 데이터로 헤더,와 데이터 를 파라메터로 주면 테이블이 표시 된다.
node_table_header = ['Node Name', ' Server IP', ' Server Port']
node_data_list = [
#('NDOE1','127.0.0.1',20300)
]
node_table_model = MyTableModel(self, node_data_list, node_table_header )
self.tblViewNode.setModel(node_table_model)
위 코드는 tblViewNode (QTableView) 객체에 헤더만 구성된 빈 테이블 뷰를 표시한다.
node_data_list[]에 데이터가 체워지면 화면에 표시 될수 있다.
이벤트 핸들러
self.tblViewNode.doubleClicked.connect(self.btnChangeNodeClick)위와 같이 더블 클릭시에 호출할 함수를 연결 할 수 있다.
편집 기능이 추가된 TableModel Class 만들기
def flags(self, index):if index.column() == 1: #range만 편집 가능
return Qt.ItemIsEnabled | Qt.ItemIsSelectable | Qt.ItemIsEditable
else:
return Qt.ItemIsEnabled | Qt.ItemIsSelectable
TableModel Class에 위와 같은 함수를 추가 하면 두번째 컬럼 열은 편집 가능 한 cell 이 된다.
더블클릭을 하면 편집 모드로 진입 한다.
편집된 데이터는 data_list에 저장이 되어야 실제로 저장이 된다.
그러기 위해서는 setData 함수를 구현 해야 한다.
def setData (self, index, variant, role=Qt.EditRole):
if variant.toInt()[1] == True:
self.mylist[index.row()][index.column()] = variant.toInt()[0]
else:
self.mylist[index.row()][index.column()] = 0
return True
입력된 variant 값이 숫자형인 경우만 입력을 허용 하고 문자인 경우 0으로 대체 하는
예제이다.
댓글 없음:
댓글 쓰기