2015년 11월 13일 금요일

pyqt QTableView 다루기

QTableView 다루기

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으로 대체 하는
예제이다.



댓글 없음: