2017-12-30 43 views
0

私はカスタムツールのために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です。私は別にそれを取得する必要がありますか?

+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のデータメソッドの戻りを無効私のために不必要だった、今私はエナブを持っているそれを主導したが、そのテキストは私が試してみてくださいテキストに

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

これはうまくいきます。モデルのカスタムメソッドとして設定チエニル方法:唯一の問題は、まだTHIある –

+0

DEFのgetData(自己): 行= self.rowCount(1) データ= []の範囲内の行の (行): 配列= []の範囲内の列の (6): インデックス= self.index(行、列) 情報= index.data() array.append(情報) data.append(アレイ) DIC = {} データアイテム: dic [item [1]] =アイテム print "" print "data:" print "'(key、dic [key]) –

+0

と私がチェックボックスのセルに得た情報はNoneです...setDataメソッドでtrueまたはfalseに変更されているとは言っても... –