그래서 저는 파이썬과 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에있는 노드의 속성.그것은 정상적으로 실행되지만 첫 번째 열에서 가져 오는 정보는 항상 없음입니다. 다르게 검색해야합니까?
을 제거 대리인 배치 한 표시되지 않는 것을!'val_is_checked = index.data (Qt.CheckStateRole를) = Qt.Unchecked' – eyllanesc
이봐! 의견을 주셔서 감사합니다. 작동하는 것처럼 보이지만 확인되지 않은 경우에도 True를 반환합니다. 생각? –
모델에서 'Qt :: ItemIsUserCheckable'플래그를 활성화 했습니까? [mcve] – eyllanesc