私はカスタムツールのためにPythonとPySide2をMayaで使用しています。QItemDelegate CheckBox
私はモデル(QTableModel)とQTableViewを持っています。
モデルのすべての行には、一連の情報とチェックボックスがあります。
QItemDelegateを実行してチェックボックスとして使用する必要があります。それは結構です。そのデリゲートがチェックされているかどうかを知ることができません。
私は
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)
(ノードにMayaシーン内に格納するために)そのデータを取得するモデルを通して反復処理し、すべての行の最初の項目は、チェックボックス(代理人)であることを起こります。最終的なデータ配列では、実際にQItemDelegateオブジェクトを取得することになってしまいました。実際には、状態を取得するかどうかをチェックしたり、チェックしたりしませんでしたが、isChecked()メソッドはありません。
これを取得する方法についてのアイデアはありますか?
ありがとうございました!
######## EDIT 1ので、モデルは、コメントに記載された旗を持っている:
def flags(self, index):
return QtCore.Qt.ItemIsEditable | QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsUserCheckable
私は告白するとして、私は、私は、デリゲート間違ってやっていると思いますが、私はライン上でこのsnnipetを発見し、私はそれを理解しようとしている....が、それはこのように書きます:テーブルビューで、
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"]]
私は、これはそれをしない願っています。
ありがとうございます。
#####のEDIT 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内のノードの属性。それは問題なく実行されますが、最初の列から取得される情報は常にNoneです。私は別にそれを取得する必要がありますか?
を削除するデリゲート置かれている表示されていないこと! 'val_is_checked = index.data(Qt.CheckStateRoleを)= Qt.Unchecked' – eyllanesc
ねえ!コメントありがとうございました。それは動作しているようですが、チェックされていなくてもTrueを返すだけです。思考? –
あなたのモデルでフラグ 'Qt :: ItemIsUserCheckable'を有効にしましたか?[mcve] – eyllanesc