[Python][PySide] コンボボックスのアイテムを複数カラムで表示する

通常コンボボックスは 1 行 1 データですが、場合によってはテーブルのように 1 行 3 データなど複数のカラムで表示したい場合もあるかと思います。 そのような場合はQComboBoxViewをセットすることで、値の表示方法を変更することが出来るようです。

環境

  • Python 3.3.3
  • PySide 1.2.1

コード

#-*- coding:utf-8 -*-

import sys
from PySide import QtGui

class MainWidget(QtGui.QWidget):
	def __init__(self, parent=None):
		super(MainWidget, self).__init__(parent)
		self.resize(400, 50)

		# コンボボックスを作成
		self.combo = QtGui.QComboBox()
		# モデルを作成
		self.model = QtGui.QStandardItemModel()
		# ビューを作成
		self.view = QtGui.QTreeView()
		self.view.setIndentation(0) # インデント削除
		self.view.setHeaderHidden(True) # ヘッダーは非表示
		self.view.setUniformRowHeights(True) # 高さを固定することで表示が少し早くなる

		# サンプルデータをモデルに追加
		id = 10000
		names = ['久保 そら', '松川 浩正', '池田 まさみ', '中島 友也', '西野 愛子', '青山 恵梨香', '水崎 璃子',
				'大森 恵梨香', '川口 達士', '藤田 寛', '武田 優', '水谷 ケンイチ', '高木 慎之介', '安藤 璃奈子',
				'塩田 誠治', '奥村 薫', '小宮 景子', '飯田 勝久', '浜口 誠一', '高見 丈史',]
		ages = [26, 73, 31, 68, 62, 50, 38, 40, 65, 66, 20, 62, 52, 37, 26, 42, 66, 75, 55, 41,]
		for i in range(20):
			self.model.setItem(i, 0, QtGui.QStandardItem(str(id)))
			self.model.setItem(i, 1, QtGui.QStandardItem(names[i]))
			self.model.setItem(i, 2, QtGui.QStandardItem(str(ages[i]) + '才'))
			id += 1

		# コンボボックスにモデルをセットする、ビューにではない
		self.combo.setModel(self.model)
		# ビューをセットする、setModel より後にセットする
		self.combo.setView(self.view)
		# 選択されて表示する値のカラムを指定
		self.combo.setModelColumn(1)
		# コンボボックスで値が選択された時の処理をセット
		self.combo.activated.connect(self.get_value)
		# ビューの signal も発生するのでセットしてみる
		self.view.activated.connect(self.get_value)

		layout = QtGui.QVBoxLayout()
		layout.addWidget(self.combo)
		self.setLayout(layout)

	def get_value(self, index):
		'''
		選択された値を取得
		'''
		# コンボボックスのテキスト
		print(self.combo.itemText(index))
		# index からモデルのアイテムを取得
		print(self.model.item(index, 0).text(), self.model.item(index, 1).text(), self.model.item(index, 2).text())

if __name__ == '__main__':
	app = QtGui.QApplication(sys.argv)
	main = MainWidget()
	main.show()
	sys.exit(app.exec_())

目的の表示は出来ましたが、通常の値を表示するより結構重くなるみたいです。 件数が多くなる場合は注意が必要かもしれません。もしかしたらもっと良い方法があるのかもしれないです。

実行例

参考

Trackbacks & Pingbacks

  • None

Comments

  • No Comment
Name
Mail(任意) 公開されません
Web Site(任意)
Comment

日本語が含まれない投稿は無視されますのでご注意ください