QListViewでアイテムを強調表示する!!

QListViewに表示したアイテムで、存在しないパスなど、注意を促したい時などにアイテムを強調表示したいときございませんか!?

存在しないパスは背景を赤く表示される

こんな感じで存在しないパスの場合、強調表示できるようにしてみたいと思いますー!!(`・ω・´)ゞ

クラスの骨格

今回は、View系でよく使うQStandardItemを継承して背景色を変えられるようにしていきます!

import os
from PySide import QtGui

class StandardItem(QtGui.QStandardItem):
	def __init__(self, *args, **kwargs):
		super(StandardItem, self).__init__(*args, **kwargs)

強調表示する時の背景色

__init__」で、インスタンス変数「__brush」を用意して、強調表示する時の背景色を設定します。

import os
from PySide import QtGui

class StandardItem(QtGui.QStandardItem):
	def __init__(self, *args, **kwargs):
		super(StandardItem, self).__init__(*args, **kwargs)
		
		self.__brush = QtGui.QBrush(QtGui.QColor('#640000'))

setTextのオーバーライド

パスを設定したら、強調表示するか・しないかを自動で行いたいので、メソッド「setText」をオーバーライドして、処理を追加します。

import os
from PySide import QtGui

class StandardItem(QtGui.QStandardItem):
	def __init__(self, *args, **kwargs):
		super(StandardItem, self).__init__(*args, **kwargs)
		
		self.__brush = QtGui.QBrush(QtGui.QColor('#640000'))
		
	def setText(self, text):
		super(StandardItem, self).setText(text)
		self.__updateBackgroundColor()
		
	def __updateBackgroundColor(self):
		# パスが存在しない場合、背景色を変える
		if not os.path.exists(self.text()):
			self.setBackground(self.__brush)
			
		# パスが存在する場合、背景色をデフォルトにする
		else:
			self.setBackground(QtGui.QBrush())

実際に背景色を変更するのは、メソッド「__updateBackgroundColor」になります。これは、後から強調表示をON/OFFする必要がでてくる可能性に備えています。

外部から強調表示する時の色を変更できるようにする

インスタンス変数「__brush」は外部から変更できませんので、他の色に変えられるようにメソッド「setHighlightColor」を追加します。

ここでは、Web系でよく使われる「#」から始まる6桁の数字で指定できるようにします。Photoshopでいうと、ココになります。

import os
from PySide import QtGui

class StandardItem(QtGui.QStandardItem):
	def __init__(self, *args, **kwargs):
		super(StandardItem, self).__init__(*args, **kwargs)
		
		self.__brush = QtGui.QBrush(QtGui.QColor('#640000'))
		
	def setText(self, text):
		super(StandardItem, self).setText(text)
		self.__updateBackgroundColor()
		
	def __updateBackgroundColor(self):
		# パスが存在しない場合、背景色を変える
		if not os.path.exists(self.text()):
			self.setBackground(self.__brush)
			
		# パスが存在する場合、背景色をデフォルトにする
		else:
			self.setBackground(QtGui.QBrush())
		
	def setHighlightColor(self, color16code):
		self.__brush = QtGui.QBrush(QtGui.QColor(color16code))
		self.__updateBackgroundColor()#背景色の更新

テストコード

早速、作成したクラスを使い、QListViewにアイテムを追加してみたいと思います!

import os
from PySide import QtCore, QtGui

view = QtGui.QListView()
view.setWindowFlags(QtCore.Qt.Window)

model = QtGui.QStandardItemModel()
view.setModel(model)

item = StandardItem()
item.setText(r'C:\windows')
model.setItem(model.rowCount(), 0, item)

item = StandardItem()
item.setText(r'C:\highlight-items-in-qlistview')#わざと存在しないパスを設定
model.setItem(model.rowCount(), 0, item)

view.show()

実行すると、存在しないパスのアイテムの背景色が「#640000」になりました!(*´ω`*)b

item.setHighlightColor(‘#2c69c5’)」を追加すると、強調表示の色変更もバッチリです!(*´ω`*)b