2017-01-09 38 views
1

下の図のように子ノードを追加するにはどうすればよいですか?私は単一の行と子供を追加する方法を知っています。しかし、2番目の列にチェックボックスを持つ子ノードを追加しようとすると、私は立ち往生します。複数の列を持つ子をpysideのqtreeviewに追加する

enter image description here

import sys 
import os 
from PySide import QtGui, QtCore 

class Soccer(object): 
    def __init__(self, name='', team=''): 
     self.name = name 
     self.team = team 
     self.op_forward = True 
     self.op_goalie = False 

class Football(object): 
    def __init__(self, name='', team=''): 
     self.name = name 
     self.team = team 
     self.op_quarterback = False 
     self.op_center = False 
     self.op_coach = False 

class Example(QtGui.QMainWindow): 
    def __init__(self, parent=None): 
     super(Example, self).__init__(parent) 
     self.resize(500, 300) 
     self.setWindowTitle('Test') 

     # variables 
     self.assets = [ 
      Soccer(name='Doug', team='Nailers'), 
      Soccer(name='Leslie', team='Sonics'), 
      Football(name='Kevin', team='Patriots'), 
      Football(name='Matt', team='Cowboys'), 
     ] 

     # create widgets 
     lb_simulators = QtGui.QLabel('Simulators') 
     lb_simulators.setProperty('class', 'section') 

     self.items_model = QtGui.QStandardItemModel() 
     self.ui_items = QtGui.QTreeView() 
     self.ui_items.setAlternatingRowColors(True) 
     self.ui_items.setSortingEnabled(True) 
     self.ui_items.setAllColumnsShowFocus(True) 
     self.ui_items.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers) 
     self.ui_items.header().setResizeMode(QtGui.QHeaderView.Interactive) 
     self.ui_items.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows) 
     self.ui_items.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection) 
     self.ui_items.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) 
     self.ui_items.sortByColumn(0, QtCore.Qt.AscendingOrder) 
     self.ui_items.setModel(self.items_model) 
     self.ui_items.setRootIsDecorated(False) 
     self.ui_items.setFont(QtGui.QFont("Arial", 8, QtGui.QFont.Normal)) 

     # layout 
     grid = QtGui.QVBoxLayout() 
     grid.setContentsMargins(10,10,10,10) 
     grid.addWidget(lb_simulators) 
     grid.addWidget(self.ui_items) 

     # main layout 
     main_widget = QtGui.QWidget() 
     main_widget.setLayout(grid) 
     self.setCentralWidget(main_widget) 

     self.create_model() 

    def create_model(self): 
     model = self.ui_items.model() 
     model.clear() 
     headers = ['Name', ''] # 'Sim', 'Continue', 'Wavelet/Resim', 'Post'] 
     model.setHorizontalHeaderLabels(headers) 
     self.ui_items.sortByColumn(0, QtCore.Qt.AscendingOrder) 

     for x in self.assets: 
      model.insertRow(0) 

      # Append object 
      model.setData(model.index(0, 0), x, role=QtCore.Qt.UserRole) 
      model.setData(model.index(0, 0), x.name) 
      model.setData(model.index(0, 1), x.team) 

      # if isinstance(x, Football): 
      #  item = model.itemFromIndex(model.index(0,0)) 


def main(): 
    app = QtGui.QApplication(sys.argv) 
    ex = Example() 
    ex.show() 
    sys.exit(app.exec_()) 

if __name__ == '__main__': 
    main() 

答えて

1

setDataメソッドは、指定されたdata roleの値を設定します。アイテムをチェック可能にする役割はQt.CheckStateRoleであり、値はcheck-state enumで与えられます。

だからあなたの例では2番目の列は次のようにチェック可能行うことができます:あなたはQStandardItemModelを使用している場合

model.setData(model.index(0, 1), x.team) 
model.setData(model.index(0, 1), QtCore.Qt.Unchecked, QtCore.Qt.CheckStateRole) 

はしかし、それはより読みやすい構文を提供するので、ツリービューを移入するためにあなたのループができました次のように書き直す:

for x in self.assets: 
    column1 = QtGui.QStandardItem(x.name) 
    column1.setData(x, QtCore.Qt.UserRole) 
    column2 = QtGui.QStandardItem(x.team) 
    column2.setCheckable(True) 
    model.appendRow([column1, column2]) 
関連する問題