Houdini 19.5 Pythonスクリプト hou hou.qt

hou.qt.ColorPalette class

小さなカラーパレットから迅速にカラーを選択することができる便利ウィジェット。

On this page

概要

独自のカスタムカラーを毎回指定しなければならないという面倒事をなくすために、事前に定義されたカラーのリストからユーザがカラーを選択できるようにしたい場合があります。 例えば、ユーザインターフェース内でアイテムを色別に“タグ付け”すれば、それらのアイテムを整理することができます。

このウィジェットでは、カラーのリストを指定することができ、ユーザはそのリストからカラーを選択し、必要あればそのカラーを編集することができます。

このオブジェクトは以下の2通りの使い方があります:

  • パレットウィンドウがパッと現れて、ユーザがカラーをクリックすると、そのパレットウィンドウが消えるポップアップウィンドウとして使用することができます。

  • または、ウィジェットレイアウト内に通常のQtウィジェットとして埋め込むことができます。これは、例えば、何かのカラーを選択するためのパレットを用意したいプリファレンスウィンドウで役に立ちます。

ColorPaletteをポップアップとして使用する方法

このカラーパレットは モードレス です。 そのため、カレーパレットが開いてもスクリプトは引き続き実行されるので、シグナルを使用して、ユーザがそのパレットをどのように操作しているのかフィードバックを取得する必要があります。

class MyWindow(QtWidgets.QDialog):
    def __init__(self, parent=None):
        super(MyWindow, self).__init__(parent)

        self._colors = [
            QtGui.QColor(255, 0, 0),
            QtGui.QColor(0, 255, 0),
            QtGui.QColor(0, 0, 255),
            QtGui.QColor(255, 255, 0),
            QtGui.QColor(255, 0, 255),
            QtGui.QColor(0, 255, 255),
            QtGui.QColor(255, 128, 0),
            QtGui.QColor(255, 255, 255),
            QtGui.QColor(0, 0, 0),
        ]

        self._palette = ColorPalette(self._colors)
        self._palette.colorSelected.connect(self._chose_color)

        layout = QtWidgets.QVBoxLayout()
        self.setLayout(layout)

        self._label = QtWidgets.QLabel("No color")
        layout.addWidget(self._label)
        self._button = QtWidgets.QPushButton("Choose")
        self._button.clicked.connect(self._palette.show)
        layout.addWidget(self._button)

    def _chose_color(self, ix, color):
        msg = "Color #{}, R: {}, G: {}, B: {}".format(
            ix, color.red(), color.green(), color.blue()
        )
        self._label.setText(msg)

Note

このウィジェットへの持続的な参照が少なくとも1個なければならないことを忘れないでください。 そうしないと、そのウィンドウがガーベジコレクションされて即座に閉じられてしまいます。

Qtレイアウト内にColorPaletteをウィジェットとして埋め込む方法

単にListEditorをウィジェットとして使用し、シグナルを使用することで、ユーザがそのパレットを操作した時に反応を起こすことができます。

class MyWindow(QtWidgets.QDialog):
    def __init__(self, parent=None):
        super(MyWindow, self).__init__(parent)

        self._colors = [
            QtGui.QColor(255, 0, 0),
            QtGui.QColor(0, 255, 0),
            QtGui.QColor(0, 0, 255),
            QtGui.QColor(255, 255, 0),
            QtGui.QColor(255, 0, 255),
            QtGui.QColor(0, 255, 255),
            QtGui.QColor(255, 128, 0),
            QtGui.QColor(255, 255, 255),
            QtGui.QColor(0, 0, 0),
        ]

        layout = QtWidgets.QVBoxLayout()
        self.setLayout(layout)

        self._label = QtWidgets.QLabel("No color")
        layout.addWidget(self._label)

        self._palette = ColorPalette(self._colors, size=24)
        self._palette.colorSelected.connect(self._chose_color)
        self._palette.colorEdited.connect(self._edited_color)
        layout.addWidget(self._palette)

    def _chose_color(self, ix, color):
        msg = "Color #{}, R: {}, G: {}, B: {}".format(
            ix, color.red(), color.green(), color.blue()
        )
        self._label.setText(msg)

スウォッチレイアウト

  • ウィジェットのサイズは、スウォッチサイズ(イニシャライザのsize引数)とパレット内のカラー数から求まります。

  • デフォルトでは、カラーパレットはできるだけ正方形になるようにスウォッチの配置を試みます。

  • 配置するカラーの数が十分でない場合、スウォッチに空きができます。

  • イニシャライザのcolumns引数を指定すると、ウィジェットはその指定した列幅に固定され、行が増えるほどスウォッチは下に配置されていきます。

  • イニシャライザのrows引数を指定すると、ウィジェットはその指定した行幅に固定され、列が増えるほどスウォッチは右に配置されていきます。

  • rows引数とcolumns引数の両方を指定すると、そのレイアウトは、 カラーリストのカラーが収まり切らなくても その行と列の幅のとおりになります。

  • デフォルトでは、カラーリストのカラーは、1行目の左から右、次に2行目の左から右という順番で並びます。イニシャライザにby_column=Trueを渡すと、ウィジェットは1列目の上から下、次に2列目の上から下という順番でカラーを並べます。

ユーザがカラーを編集できるようにする方法

デフォルトでは、ユーザはパレット内のカラーをAltクリックすることで、そのスウォッチのカラー値を編集することができます。 編集したカラーをユーザが受け入れると(編集操作をキャンセルしなかった場合)、ウィジェットはcolorEditedシグナルを送信します。

Note

編集したパレットはColorPaletteオブジェクト内で維持されます。 別のColorPaletteオブジェクトを使用した時でも別のセッションで使用した時でもそのパレットを持続させたいのであれば、あなた自身でその処理を加える必要があります。

ユーザがカラーを編集できないようにしたいのであれば、ウィジェットを作成する時にallow_editing=Falseを渡すか、または、ウィジェットに対してsetEditingAllowed(False)をコールしてください。

背景カラー

  • デフォルトでは、ウィジェットの背景は、現行パレットのデフォルトのウィンドウ背景で塗られます。イニシャライザにbg_color引数を渡すことで、カスタムカラー(またはブラシ)を指定することができます。

  • 空っぽのスウォッチは特別なブラシで塗られます。デフォルトのブラシは、暗いまたは明るい斜線を描画します。イニシャライザにempty_color引数を渡すことで、空っぽの正方形にカスタムカラー(またはブラシ)を指定することができます。

Tipsとメモ

  • カラーリスト内の“カラー”には、QColorオブジェクトだけでなく、QBrushオブジェクトも指定することができます。このQBrushオブジェクトを使用することで、単色だけでなくグラデーション、パターン、テクスチャをパレット内のスウォッチとして設定することができます。

シグナル

paletteChanged()

setColorList()によってパレット全体が置換された時に発動されます。

colorEdited(index: int, old: QColor, new: QColor)

ユーザがカラーのどれかを手動で編集した時に発動されます(上記のカラーの編集を参照してください)。

colorSelected(index: int, color: QColor)

ユーザがパレット内のカラーを選択した時に発動されます。 ユーザが別のカラーにドラッグする度に、または、レイアウトにウィジェットが埋め込まれている場合だとユーザがカラー選択を変更する度に、シグナルを発動することができます。ユーザがポップアップからカラーを選択してそのポップアップが閉じた時にのみ反応を起こしたいのであれば、代わりにcolorAcceptedシグナルを使用してください。

colorAccepted(index: int, color: QColor)

ユーザがポップアップ内のカラー上でマウスボタンを離してそのポップアップが閉じた時にのみ発動されます。

colorCancelled()

ユーザが有効なカラーを選択せずにポップアップを閉じた場合(例えば、ポップアップ外をクリックしたり、空っぽの空間をクリックした場合)に発動されます。

メソッド

hou.qt