見出し画像

TreeView

今回はLayer構造をTreeViewで作成してみる。

Qt Designer

TreeViewWindow

コード

	def __setupUI(self):
		# Layout
		widget = self.ui.centralWidget()
		h_lo = self.ui.findChild(QHBoxLayout, 'h_lo')
		# ListView
		a_tv = self.ui.findChild(QTreeView, 'a_tv')
		a_tv.clicked.connect(self.treeClicked)
		self.getLayerList()
		h_lo.addWidget(a_tv)
		widget.setLayout(h_lo)
		self.setCentralWidget(widget)
		self.getLayerNameList()

		self.logger.debug("Setup UI")

	def getLayerList(self):
		mgr = rt.LayerManager
		self.layer_list:list = []

		for i in range(mgr.count):
			layer = mgr.getLayer(i)
			if layer != None:
				self.layer_list.append(layer)

		self.logger.debug(self.layer_list)

	def getLayerNameList(self):
		model_list = QStandardItemModel()
		root = model_list.invisibleRootItem()
		for i in range(len(self.layer_list)):
			layer = self.layer_list[i]
			if layer != None:
				item = QStandardItem(layer.name)
				if layer.getParent() == None:
					root.appendRow(item)
				else:
					parent = model_list.findItems(layer.getParent().name, Qt.MatchExactly)
					parent[0].appendRow(item)

				result, child_node = layer.nodes(pymxs.byref(None))
				if len(child_node) > 0:
					for node in child_node:
						if node != None:
							child = QStandardItem(node.name)
							item.appendRow(child)

		a_tv = self.findChild(QTreeView, 'a_tv')
		model_list.setHeaderData(0, Qt.Horizontal, "Name", Qt.DisplayRole)
		self.logger.debug(model_list.headerData(0, Qt.Horizontal, Qt.DisplayRole))
		a_tv.setModel(model_list)

	def treeClicked(self, index):
		tv:QTreeView = self.sender()
		r = index.row()
		item = tv.model().index(r, 0, index.parent())
		self.showMessage(item.data())

__setupUI関数は、ListViewの時とほぼ同じ。

レイヤー階層

getLayerList関数でレイヤーのリストを取得する。
3dsMaxのレイヤーはちょっと特殊なデータの持ち方をしている。
以下、レイヤーをName, Parent, Nodesで表示してみる。

Name: 0
Parent: None
Nodes: (True, [])
Name: Layer001
Parent: None
Nodes: (True, [])
Name: Layer002
Parent: <MixinInterface:LayerProperties>
Nodes: (True, [<Sphere<$Sphere:Sphere001 @ [0.731744,0.983925,0.000000]>>])
Name: Layer003
Parent: None
Nodes: (True, [])
Name: Layer004
Parent: <MixinInterface:LayerProperties>
Nodes: (True, [<Teapot<$Teapot:Teapot001 @ [-32.672844,26.833195,0.000000]>>, <Box<$Box:Box001 @ [28.900925,-33.267628,0.000000]>>])

レイヤーのリストはフォルダのみを保持していて、フォルダの階層は親のフォルダがあるかで表現している。
フォルダ内にある各オブジェクトはノードリストとして保持している。
これで、レイヤーの階層データを構成している。

通常の親子関係は親の中に子を保持する。
子がフォルダなのかオブジェクトなのかは関係ない。
子がフォルダなのか、オブジェクトなのかは、取得するときに型をみる。

getLayerNameList関数でTreeViewに表示する文字列の階層構造を取得する。
階層構造はQStandardItemModelを使用して、これをRootとして各レイヤーのQStandardItemを作成。
レイヤーデータがParentを持つかどうかで、appedRowするItemを決めている。
Nodesに関しては、Nodesを持っている場合は、もっているItemを親として各ノードをappendRowする。
これで3dsMaxのレイヤーと同じ表示になる階層構造を作成して、TreeViewにモデルをセットする。

TreeView

他の情報を別カラムで表示するようにするには、独自のModelを作成する必要があり、ちょっとめんどくさい。
これについては、次回のTableViewで記述する。

この記事が気に入ったらサポートをしてみませんか?