2017-12-30 31 views
0

그래서 저는 파이썬과 PySide2를 Maya에서 사용자 정의 도구로 사용하고 있습니다.QItemDelegate CheckBox

모델 (QTableModel)과 QTableView가 있습니다.

모델의 모든 행에는 일련의 정보와 확인란이 있습니다.

QItemDelegate를 수행하여 확인란으로 사용해야합니다. 괜찮습니다. 해당 대리인이 선택되어 있는지 확인하는 데 문제가 있습니다.

나는 모델이 데이터를 얻기 통해 (노드에서 Maya 씬 내부를 저장하는)

data = [] 
    rows = self.rowCount(1) #self is the model in this snnipet 
    for row in range(rows): 
     array = [] 
     for column in range (6): #6 for the fixed number of columns 
      info = index.data() 
      array.append(index.data()) 
     data.append(array) 

그리고이 모든 행의 첫 번째 항목이 체크 박스 (대표)이라고 일이 반복. 최종 데이터 배열에서 실제로 QItemDelegate 객체를 얻는 것은 최종적으로 상태를 가져오고 싶거나 체크하지 않았지만 isChecked() 메소드가 없다는 것을 의미합니다.

아이디어를 얻는 방법은 무엇입니까?

대단히 감사합니다!

######## EDIT 1

그래서, 모델이 코멘트에 언급 플래그를 가지고있다 : 내가 고백, 나는 내가 잘못 대리자를하고있는 중이 야 생각

def flags(self, index): 
     return QtCore.Qt.ItemIsEditable | QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsUserCheckable 

를, 나는 행에서이 snnipet을 발견하고 나는 그것을 이해하려고 노력 중이 야 ....하지만 이렇게되면 다음의 TableView에서

class CBDelegate(QItemDelegate): 

def __init__(self, parent): 

    QItemDelegate.__init__(self, parent) 


def paint(self, painter, option, index): 

    self.cb = QCheckBox() 

    try: 
     self.cb.setChecked(index.data()) 
    except: 
     pass 

    if not self.parent().indexWidget(index): 
     self.parent().setIndexWidget(index, self.cb) 

다음 :

self.setItemDelegateForColumn(0, CBDelegate(self)) 

도움이 되었습니까? (당신이 마야 2017이있는 경우 내가 그것을 내가 학습 운동으로 이것을 사용하고 같은 혼란의 일종이다 ... 당신에게 전체 코드를 줄 수 있습니다!

감사합니다.

######을 ###### EDIT 2

테이블 뷰 :

class Table(QTableView): 
    def __init__(self, *args, **kwargs): 
     QTableView.__init__(self, *args, **kwargs) 

     # Set the delegate for column 0 of our table 
     #self.setItemDelegateForColumn(6, ButtonDelegate(self)) #problem for another time 
     self.setItemDelegateForColumn(0, CBDelegate(self)) 

모델 :.

class Model(QtCore.QAbstractTableModel): 

    def __init__(self, cycles = [[]], headers = [], parent = None): 
     QtCore.QAbstractTableModel.__init__(self, parent) 

     self.cycles = cycles 
     self.headers = headers 

    def rowCount(self, parent): 

     return len(self.cycles) 

    def columnCount(self, parent): 
     return len(self.cycles[0]) 

    def flags(self, index): 
     return QtCore.Qt.ItemIsEditable | QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsUserCheckable 

    def data(self, index, role): 

     if role == QtCore.Qt.DisplayRole: 

      row = index.row() 
      column = index.column() 
      value = self.cycles[row][column] 
      return value 

     if role == QtCore.Qt.EditRole: 

      row = index.row() 
      column = index.column() 
      return self.cycles[row][column] 

     if (role == QtCore.Qt.TextAlignmentRole): 
      return QtCore.Qt.AlignCenter; 

    def setData(self, index, value, role = QtCore.Qt.EditRole): 

     change = False 

     if role == QtCore.Qt.EditRole: 

      row = index.row() 
      column = index.column() 

      value = value 

      if (column == 1) or (column == 4): 
       try: 
        str(value) 
        change = True 
       except: 
        pm.warning("Not a valid name") 
        change = False 
      elif (column == 2): 
       try: 
        int(value) 
        change = True 
       except: 
        pm.warning("Not a valid frame") 
        change = False 
      elif (column == 3): 
       try: 
        int(value) 
        change = True 
       except: 
        pm.warning("Not a valid frame") 
        change = False 

      elif (column == 5): 
       try: 
        int(value) 
        change = True 
       except: 
        pm.warning("Not a valid version number") 
        change = False 

      if change: 
       self.cycles[row][column] = value 
       self.dataChanged.emit(row, column) 
       return True 

      return False    

    def headerData(self, section, orientation, role): 

     if role == QtCore.Qt.DisplayRole: 

      if orientation == QtCore.Qt.Horizontal: 
       return self.headers[section] 

    def insertRows(self, position, rows, values = [] , parent = QtCore.QModelIndex()): 


     self.beginInsertRows(parent, position, position+rows-1) 

     self.cycles.insert(position, values) 

     self.endInsertRows() 

     self.getData() 



    def getData(self): 

     rows = self.rowCount(1) 

     data = [] 

     for row in range(rows): 
      array = [] 
      for column in range (6): 
       index = self.index(row, column) 
       info = index.data() 

       if type(info) == bool: 
        array.append(info) 

       elif type(info) == QItemDelegate: 
        val_is_checked = index.data(QtCore.Qt.CheckStateRole) != QtCore.Qt.Unchecked 
        array.append(val_is_checked) 

       else: 
        info = str(info) 
        array.append(info) 

      array.append("del") 
      data.append(array) 

     dic = {} 
     for item in data: 
      dic[item[1]]=item 

     for key in dic: 
      print key, dic[key] 


     #this from pickle 
     #newData = data2String(dic) 
     # and this is what I wanna save inside Maya 
     #pm.setAttr("cycleAnimationListNode.cycles", newData) 

위임 위, 편집 1에

은 그럼 당신은 여전히이 모델을 시작하는주기와 헤더를해야 할 것 같아요 :이 그것을하지 않습니다 희망

headers = ["Select", " Cycle Name ", " Start ", " End ", "Info", "Version", " Del "] 

cycles = [[False,"idle","1","70","cool information","0", "deleteBtnPlaceHolder"]] 

합니다.

감사합니다.

##### 편집 3

나는이 사용자 정의 모델의 방법이 : 나는 사전에 모델을 transforme하는 데 사용할

def getData(self): 
     rows = self.rowCount(1) 
     data = [] 
     for row in range(rows): 
      array = [] 
      for column in range (6): 
       index = self.index(row, column) 
       info = index.data() 
       array.append(info)    
      data.append(array) 

     dic = {} 
     for item in data: 
      dic[item[1]]=item 

     print "" 
     print "data:" 
     print '' 
     for key in dic: 
      print(key, dic[key]) 

를, 그래서는 문자열로 저장을 직렬화 할 수 있습니다 Autodesk Maya에있는 노드의 속성.그것은 정상적으로 실행되지만 첫 번째 열에서 가져 오는 정보는 항상 없음입니다. 다르게 검색해야합니까?

+0

을 제거 대리인 배치 한 표시되지 않는 것을!'val_is_checked = index.data (Qt.CheckStateRole를) = Qt.Unchecked' – eyllanesc

+0

이봐! 의견을 주셔서 감사합니다. 작동하는 것처럼 보이지만 확인되지 않은 경우에도 True를 반환합니다. 생각? –

+0

모델에서 'Qt :: ItemIsUserCheckable'플래그를 활성화 했습니까? [mcve] – eyllanesc

답변

1

당신 만이 정보가 있기 때문에 손실되는 코드에서부터, setData()을 통해 정보를 저장해야합니다뿐만 아니라, 제대로 플래그 Qt::ItemIsUserCheckable를 활성화해야합니다, 당신은 QCheckBox를 표시 할 경우 대리자를 사용할 필요가 없습니다 이러한 수정과 모델은 다음의 섹션에서 나타낸다 저장된 :

업데이트 :이 표에서 텍스트를 배치 이후

이전 첫번째 열의 역할 Qt::DisplayRole의 데이터에있어서의 복귀를 중지한다 나를 위해 불필요한, 지금 나는 enab 그것을 주도하지만 그렇게 텍스트 내가 함께 시도 텍스트를

from PySide2.QtWidgets import * 
from PySide2.QtCore import * 

class Model(QAbstractTableModel): 
    def __init__(self, cycles = [[]], headers = [], parent = None): 
     QAbstractTableModel.__init__(self, parent) 
     self.cycles = cycles 
     self.headers = headers 
     self.values_checked = [] 

    def rowCount(self, parent): 
     return len(self.cycles) 

    def columnCount(self, parent): 
     return len(self.cycles[0]) 

    def flags(self, index): 
     fl = Qt.ItemIsEnabled | Qt.ItemIsSelectable 
     if index.column() == 0: 
      fl |= Qt.ItemIsUserCheckable 
     else: 
      fl |= Qt.ItemIsEditable 
     return fl 

    def data(self, index, role): 
     if not index.isValid(): 
      return 
     row = index.row() 
     column = index.column() 

     if role == Qt.DisplayRole: 
      value = self.cycles[row][column] 
      return value 

     elif role == Qt.TextAlignmentRole: 
      return Qt.AlignCenter; 

     elif role == Qt.CheckStateRole and column==0: 
      return Qt.Checked if self.cycles[row][column] else Qt.Unchecked 


    def setData(self, index, value, role = Qt.EditRole): 
     change = False 
     row = index.row() 
     column = index.column() 

     if role == Qt.CheckStateRole: 
      value = value != Qt.Unchecked 
      change = True 
     if role == Qt.EditRole: 
      if (column == 1) or (column == 4): 
       try: 
        str(value) 
        change = True 
       except: 
        pm.warning("Not a valid name") 
        change = False 
      elif (column == 2): 
       try: 
        int(value) 
        change = True 
       except: 
        pm.warning("Not a valid frame") 
        change = False 
      elif (column == 3): 
       try: 
        int(value) 
        change = True 
       except: 
        pm.warning("Not a valid frame") 
        change = False 

      elif (column == 5): 
       try: 
        int(value) 
        change = True 
       except: 
        pm.warning("Not a valid version number") 
        change = False 
     if change: 
      self.cycles[row][column] = value 
      self.dataChanged.emit(row, column) 
      return True 
     return False    

    def headerData(self, section, orientation, role): 
     if role == Qt.DisplayRole: 
      if orientation == Qt.Horizontal: 
       return self.headers[section] 

    def insertRows(self, position, rows, values = [] , parent =QModelIndex()): 
     self.beginInsertRows(parent, position, position+rows-1) 
     self.cycles.insert(position, values) 
     self.endInsertRows() 
     self.getData() 

    def roleNames(self): 
     roles = QAbstractTableModel.roleNames(self) 
     roles["Checked"] = Qt.CheckStateRole 
     return roles 


    def getData(self): 
      rows = self.rowCount(1) 
      data = [] 
      for row in range(rows): 
       array = [] 
       for column in range (6): 
        index = self.index(row, column) 
        info = index.data() 
        array.append(info)    
       data.append(array) 

      dic = {} 
      for item in data: 
       dic[item[1]]=item 

      print("") 
      print("data:") 
      print('') 
      for key in dic: 
       print(key, dic[key]) 


class EmptyDelegate(QStyledItemDelegate): 
    def paint(self, painter, option, index): 
     opt = QStyleOptionViewItem(option) 
     self.initStyleOption(opt, index) 
     opt.text = "" 
     QApplication.style().drawControl(QStyle.CE_ItemViewItem, opt, painter) 


if __name__ == '__main__': 
    import sys 

    app = QApplication(sys.argv) 
    w = QTableView() 
    w.setItemDelegateForColumn(0, EmptyDelegate(w)) 
    headers = ["Select", " Cycle Name ", " Start ", " End ", "Info", "Version", " Del "] 
    cycles = [[True,"idle","1","70","cool information","0", "deleteBtnPlaceHolder"]] 
    model = Model(cycles, headers) 
    w.setModel(model) 
    w.show() 
    sys.exit(app.exec_()) 
+0

이것은 잘 진행 중입니다. 유일한 문제는 아직은 : 모델의 사용자 정의 메서드로 thie 메서드를 설정 : –

+0

def getData (self) : rows = self.rowCount (1) data = [] 범위 (행)의 행 : 어레이 = [] 범위의 열 (6)의 경우 : 인덱스 = self.index (행, 열) 정보 index.data =() array.append (정보) data.append (배열) DIC = {} 데이터 항목 : dic [항목 [1]] = 항목 인쇄 "" 인쇄 "데이터 :" 인쇄 " for dic : print (key, dic [key]) –

+0

그리고 체크 박스 셀에 대한 정보는 없음입니다.setData 메소드에서 true 또는 false로 변경한다고해도 ... –