On this page |
概要 ¶
ユーザインターフェースをデザインする時に、ユーザ側で文字列のリストを表示/編集できるようにしたい場合が多いです。 例えば、プラグインファイルが検索されるディレクトリのリスト、オブジェクトに適用するタグのリスト、ライトが照明するオブジェクトパスのリストなどを設定できるようにしたいです。
このようなジョブに対応できるように、このオブジェクトにはコンパクトでシンプルでも強力なエディタが備わっています。 ここでは、ユーザに表示する文字列のリストを用意します。 ウィジェットでは、(オプションに応じて)ユーザがそのリストにアイテムを追加、削除、並べ替え、編集をすることができます。
文字列のテキストの編集だけでなく、各アイテムの隣に チェックボックス を表示して、そのチェック状態を付加情報として使用することができます。 例えば、ユーザがプロップを取り出したいアセットライブラリのリストを指定できるインターフェースが欲しいとします。 アイテムの隣にチェックボックスを用意することで、アセットライブラリを個々に削除して再追加する必要なく、個々のアセットライブラリを一時的に有効/無効にすることができます。
hou.qt.ListEditorDialog
便利クラスの使い方
¶
ダイアログウィンドウ内のListEditor
を取得するには、hou.qt.ListEditorDialog
既製クラスを使用すると良いです。
このクラスは、ListEditor
と同じキーワード引数を受け取り、単にダイアログウィンドウ内でそのListEditor
ウィジェットをラップしているだけです。
ListEditorDialog.editor()
を使用すると、そのListEditor
の参照を取得することができます。
このクラスはQtのQtWidgets.QDialog
クラスを継承しています。
このオブジェクトに用意されている膨大な数の便利なメソッドの情報は、Qtドキュメントを参照してください。
モーダルダイアログ ¶
この方法でウィジェットをコールすると、ユーザはそのダイアログを受け入れ、または、キャンセルしないと、他のHoudiniウィンドウを使用することができません。
-
必要なオプションを使ってウィジェットをインスタンス化して設定します。
-
そのウィジェットの
.exec_()
メソッドをコールするとダイアログが開き、ユーザがそのダイアログの操作を終了するまで待機します。 -
その
.exec_()
メソッドコールの戻り値を使用することで、ユーザがそのダイアログを受け入れたのか、または、キャンセルしたのかを判断することができます。
dialog = hou.qt.ListEditorDialog(allow_editing=True, allow_add_remove=True, allow_reorder=True, allow_empty_string=False) dialog.setWindowTitle("Edit Files") dialog.resize(400, 360) editor = dialog.editor() editor.setTopMessage("Add, remove, or edit which files to read") # 変数から現在のファイルパスのリストを取得します。 editor.setStrings(list_of_file_paths) accepted = editor.exec_() if accepted: # その変数を新しく編集したファイルパスのリストに置換します。 list_of_file_paths = editor.strings()
モードレスダイアログ ¶
-
必要なオプションを使ってウィジェットをインスタンス化して設定します。
-
そのウィジェットの
accepted
、rejected
、finished
のどれかのシグナルを接続します。 -
そのダイアログオブジェクトの
.show()
メソッドをコールすると、そのオブジェクトがウィンドウとして開かれます。
def show_tag_editor_for(node): # エディターウィジェットを作成して設定します。 dialog = hou.qt.ListEditorDialog(allow_editing=False, allow_add_remove=True, allow_reorder=False, keep_sorted=True, show_checkboxes=True, initial_check=False) dialog.setWindowTitle("Edit Tags") editor = dialog.editor() editor.setTopMessage("Check the tags you want to apply. You can add new tags.") # そのエディターの内容には、すべての既知のタグのリストを設定します。 # 指定したノードに現在適用されているタグをチェックします。 for tag in list_of_all_tags: editor.addListItem(tag, node.hasTag(tag)) # そのタグを更新する関数にそのエディターの"accepted"シグナルを接続します。 dialog.accepted.connect(lambda: update_node_tags(node, editor.stringsAndChecks())) # この関数が終了してもすぐに消えないようにこのウィジェットの参照を`hou.session`内に保存します。 # これは変数に保存していて少し単純化されていますが、 # 1度に1個のタグエディターしか存在できないことを意味します。 hou.sesssion.tag_editor = editor # ユーザが操作できるようにウィジェットをウィンドウとして表示します。 dialog.show() def update_node_tags(node, tags_and_checks): for tag, checked in tags_and_checks: if checked: node.addTag(tag)
Note
このウィジェットへの持続的な参照が少なくとも1個なければならないことを忘れないでください。 そうしないと、そのウィンドウがガーベジコレクションされて即座に閉じられてしまいます。
Qtレイアウト内にListEditorをウィジェットとして埋め込む方法 ¶
もっと大きいユーザインターフェース内でListEditor
をそのままウィジェットとして使用することができます。
-
必要なオプションを使ってウィジェットをインスタンス化して設定します。
-
QWidget
の場合と同様に、そのウィジェットをQtインターフェースに追加します。 -
現在のエディターの内容を取得する必要がある場合は、そのウィジェットの
strings()
またはstringsAndChecks()
メソッドを使用します。
# Qtユーザインターフェースをセットアップします。 class MyUI(QtWidgets.QFrame): def __init__(self, parent): super(MyUI, self).__init__(parent) layout = QtWidgets.QVBoxLayout() self.setLayout(layout) # ListEditorオブジェクトを作成して設定します。 self._editor = hou.qt.ListEditor(allow_editing=True, allow_add_remove=True, allow_reorder=True, allow_empty_string=False) self._editor.setTopMessage("Add, remove, or edit which files to read") # 変数から現在のファイルパスのリストを取得します。 self._editor.setStrings(list_of_file_paths) # そのウィジェットをユーザインターフェースに追加します。 layout.addWidget(self._editor) def read_files(self): for filepath in self._editor.strings(): ...
Tipsとメモ ¶
-
allow_add_remove=True
且つallow_editing=False
の場合、ユーザは、新しく作成されたアイテムの初期文字列値を入力することができますが、Enterを押した後はその文字列を編集することができません。 -
allow_reorder=True
且つkeep_sorted=True
の場合、ユーザは、アイテムをドラッグすることができるものの、それらのアイテムをドラッグして並び替えることはできません。混乱を避けるために、keep_sorted
を有効にしたらallow_reorder
を無効にしてください。
シグナル ¶
itemEdited(int, str)
アイテムのテキストが変更されると発動されます。 (0から始まる)行番号とそのアイテムの新しいテキストが指定されてコールされます。
checkChanged(int, str, bool)
アイテムのチェック状態が変更されると発動されます。
(0から始まる)行番号とそのアイテムのテキストと新しいチェック状態(True
またはFalse
)が指定されてコールされます。
listChanged()
文字列のリストが変更される度に(ユーザがアイテムを追加、移動、削除する度に)発動されます。
strings()
またはstringsAndChecks()
メソッドをコールすることで、その新しいリストの内容を取得することができます。
メソッド ¶
__init__(strings=(), top_message=None, bottom_message=None, allow_editing=True, allow_add_remove=True, allow_reorder=True, allow_empty_string=True, show_checkboxes=False, keep_sorted=False, initial_string="", initial_check=True, allow_empty_list=True)
strings
リストに格納する文字列のリスト。
top_message
そのリストの上部に表示する文字列。このラベルを使用することで、そのリストの内容を示したり、ユーザに指示をすることができます。
bottom_message
そのリストの下部で、追加/削除ボタンの右側に表示する文字列。 このラベルを使用することで、ユーザにセカンダリ情報を与えることができます。
allow_editing
これがTrue
の場合、ユーザは、そのリスト内のアイテムの文字列の内容を編集することができます。
allow_add_remove
これがTrue
の場合、ユーザは、新しいアイテムを追加、既存のアイテムを削除することができます。
allow_reorder
これがTrue
の場合、ユーザは、アイテムをドラッグアンドドロップすることで、リストの順番を変更することができます。
allow_empty_string
allow_editing
が有効な場合、これは、ユーザが空っぽの文字列を入力しようとした時の挙動を制御します。
これがTrue
の場合、アイテムには空っぽの文字列を含めることができます。
これがFalse
の場合、アイテムに空っぽの文字列を設定すると、そのアイテムが削除されます。
show_checkboxes
アイテムを“有効”または“無効”にできるように、そのアイテムの隣りにチェックボックスを表示します。
keep_sorted
並べ替えられたリストを表示し、ユーザがアイテムを追加/編集した時にその並びを維持します。これを有効にした場合、必ずallow_reorder
を無効にしてください。
initial_string
ユーザが新しくアイテムを追加すると、ウィジェットは新しい行を作成し、自動的にその行を編集可能にします。ここには、その新しい行のテキスト編集フィールドの初期内容を指定します。デフォルトは空っぽです。
initial_check
show_checkboxes
が有効な時、これは、新しく作成されたアイテム(とhou.qt.InfoWindow.setStringsコールで追加されたアイテム)の初期チェック状態を制御します。
exclusive_check
同時に1個のチェックボックスしか“有効”にできないようにします。
checkedRow()
メソッドを使用することで、チェックされたアイテムのインデックスを取得することができ、checkedString()
を使用すれば、選択されたアイテムのテキストを取得することができます。
allow_empty_list
エディターがアイテムを持たないことを許可します。
これをFalse
に設定すると、エディターにアイテムが1個しかない時にユーザはその最後のアイテムを削除することができません。
これによって、エディターが空っぽのリストで初期化されないように、または、リストが空っぽに設定されないようにすることができます。
itemCount()
→ int
エディター内の行の数を返します。
setStrings(strings)
ダイアログ内に表示する文字列のリストを設定します。
strings()
→ list
of str
各アイテムの文字列の内容のリストを返します。
setStringsAndChecks(strings_and_checks)
(str, bool)
タプルのシーケンスを受け取ります。各タプルの1番目のアイテムはアイテムの文字列の内容、2番目のアイテムはそのアイテムにチェックを付けるかどうかを示したブール値です。
# /obj内のノードのリストを表示し、各ノードにはクックする必要があるかどうかを示したチェックボックスが付きます。 editor = ListEditor() for node in hou.node("/obj").children(): editor.addListItem(node.name(), node.needsToCook())
stringsAndChecks()
→ list
of (str, bool)
tuples
タプルのリストを返します。各タプルの1番目のアイテムはアイテムの文字列の内容、2番目のアイテムはそのアイテムにチェックが付けれらたかどうかを示したブール値です。
# /obj内のノードのリストを表示し、各ノードにはクックする必要があるかどうかを示したチェックボックスが付きます。 objnode = hou.node("/obj") editor = ListEditor() for node in hou.node("/obj").children(): editor.addListItem(node.name(), node.needsToCook()) # ダイアログを表示し、ユーザがそのダイアログを終了させるまで待機します。 ok = w.exec_() # ユーザがそのダイアログを受け入れた場合、チェックが付いたすべてのノードが再クックされます。 if ok: for name, checked in w.stringsAndChecks(): node = objnode.node(name) if checked: node.cook()
rowIsChecked(row_num)
→ bool
指定した(0から始まる)行番号のアイテムがチェックされていればTrueを返します。
setRowChecked(row_num, checked)
指定した(0から始まる)行番号のアイテムのチェック状態を設定します。 2つ目の引数がTrueなら、そのアイテムにはチェックが付き、Falseならチェックが外れます。
rowString(row_num)
→ str
指定した(0から始まる)行番号の文字列を返します。
checkedRows()
→ list
of int
チェックが付いたアイテムに呼応した行番号のリストを返します。
checkedStrings()
→ list
of str
チェックが付いたアイテムに呼応した文字列のリストを返します。
checkedRow()
→ int
or None
チェックが付いた1番目のアイテムの行番号を返し、どのアイテムもチェックが付いていない場合はNone
を返します。
これは、exclusive_check
がTrueの時に役立ちます。
checkedString()
→ str
or None
チェックが付いた1番目のアイテムのテキストを返し、どのアイテムもチェックが付いていない場合はNone
を返します。
これは、exclusive_check
がTrueの時に役立ちます。
addListItem(text, checked=None, insert_at=-1)
現行リストに1個のアイテムを追加します。
text
アイテムの文字列の内容。
checked
ここにTrue
またはFalse
を指定すると、アイテムのチェック状態がそれに設定されます。
これがNone
の場合、ウィジェットのinitial_check
設定がそのアイテムのチェック状態として使用されます。
insert_at
これが-1
(デフォルト)の場合、その新しいアイテムがリストの最後に追加されます。
ここに(0
から始まる)行番号を指定すると、その新しいアイテムは、そのリスト内のそのインデックスに挿入されます。
指定したインデックスにアイテムを挿入したとしても、keep_sorted
が有効であれば、そのアイテムは即座にソートされた位置に移動します。
removeRow(row_num)
指定した(0
から始まる)位置の行を削除します。
clear()
リストをクリアして、ダイアログを空っぽのままにします。
setShowCheckboxes(show)
リスト内のアイテムの隣にチェックボックスを表示するかどうかを設定します。
showCheckboxes(show)
ウィジェットがリスト内のアイテムの隣にチェックボックスを表示しているかどうか。
setKeepSorted(keep_sorted)
ウィジェットがリストをソート順で維持するかどうかを設定します。
keepSorted(show)
ウィジェトがリストをソート順で維持しているかどうか。
setTopMessage(text)
リストウィジェットの上部にテキストを設定します。
topMessage()
→ str
リスト上部のラベルの現在のテキストを返します。
setBottomMessage(text)
リスト下部にテキストを設定します。
bottomMessage()
→ str
リスト下部のラベルの現在のテキストを返します。
setAllowEditing(allow)
アイテムの文字列の内容の編集(書き換え)を許可するかどうかを設定します。
isEditingAllowed()
→ bool
ユーザがアイテムの文字列の内容の編集(書き換え)を許可されているかどうか。
setAllowEmptyList()
ユーザが最後のアイテムを削除してリストを空っぽにすることを許可するかどうかを設定します。
isEmptyListAllowed()
→ bool
ユーザが最後のアイテムを削除してリストを空っぽにすることを許可されているかどうか。
setAllowAddRemove(allow)
ユーザがアイテムを追加/削除できるようにするかどうかを設定します。
isAddRemoveAllowed()
→ bool
ユーザがアイテムを追加/削除できるかどうか。
setAllowReorder(allow)
ユーザがリスト内のアイテムをドラッグして並べ替えすることを許可するかどうかを設定します。
isReorderAllowed()
→ bool
ユーザがリスト内のアイテムをドラッグして並べ替えすることを許可されているかどうか。
setAllowEmptyString(allow)
ユーザが空っぽの文字列をアイテムの内容として入力できるようにするかどうかを設定します。
isEmptyStringAllowed()
→ bool
ユーザが空っぽの文字列をアイテムの内容として入力できるかどうか。
setInitialString(text)
新しく追加されたアイテムの初期テキストを設定します。
initialString()
→ str
ユーザがAddボタンを使って新しくアイテムを作成した時のテキストフィールド内の初期テキスト。
setInitialString(text)
新しく追加されたアイテムの初期テキストを設定します。
initialString()
→ str
ユーザがAddボタンを使って新しくアイテムを作成した時のテキストフィールド内の初期テキスト。
setInitialCheck(checked)
新しく作成されたアイテムにデフォルトでチェックを付けるかどうかを設定します。
initialCheck()
→ bool
新しく作成されたアイテムがデフォルトでチェックが付いているかどうか。