QLineEditでパスを指定してもらう入力欄を作った時、一部を書き換えて別のフォルダを指定したい時があると思います。
しかし!
フォルダ名があやふやだったりして、結局ダイアログから選んだり、Explorerなどからコピペしてしまう時があります(´・ω・`)
こんな時、フォルダ内のリストが入力候補で表示されれば便利だなーっと思いました!いわゆるオートコンプリート!Google検索の関連ワードのリストアップのような感じですね(*´ω`*)
更に!
存在しないパスのときは強調表示されると、うっかりミスも減りそうだなっと思いました(*´ω`*)
今回は、パス入力のオートコンプリートを「QLineEdit」と「QCompleter」のあわせ技で、作っていきたいと思います!(`・ω・´)ゞ
クラスの骨格
まずは、「QLineEdit」を継承したクラス「PathEditor」を定義します。
import os from PySide import QtGui class PathEditor(QtGui.QLineEdit): def __init__(self, *args, **kwargs): super(PathEditor, self).__init__(*args, **kwargs)
QCompleterの準備
続いて、「__init__」で「QCompleter」の準備をして行きます。
import os from PySide import QtGui class PathEditor(QtGui.QLineEdit): def __init__(self, *args, **kwargs): super(PathEditor, self).__init__(*args, **kwargs) completer = QtGui.QCompleter(self)# (1) completer.setModel(QtGui.QDirModel(completer))#(2) self.setCompleter(completer)#(3)
まずは、「QCompeter」のインスタンスを作成します。(1)
「QCompleter」には、文字列のリストか、Modelをセットすることができます。今回は、ディレクトリリストが欲しいので「QDirModel」というModelを使いたいと思います。QDirModelを作ることで、「QLineEdit」で入力されたパスにあるフォルダが、勝手にリストアップされるようになります!(*´ω`*)(2)
作成と設定を済ませた「QCompleter」を、「setCompleter」を使って「QLineEdit」に設定します。(3)
存在しないパスの強調表示
次は、存在しないパスが入力されている時に、背景色を赤くして強調表示していきたいと思います。(`・ω・´)ゞ
import os from PySide import QtGui class PathEditor(QtGui.QLineEdit): def __init__(self, *args, **kwargs): super(PathEditor, self).__init__(*args, **kwargs) completer = QtGui.QCompleter(self) completer.setModel(QtGui.QDirModel(completer)) self.setCompleter(completer) self.textChanged.connect(self.editEvent)#(1) def editEvent(self, text):#(2) if text and not os.path.exists(text):#(3) self.setStyleSheet('*{background-color: #640000;}')#(4) else: self.setStyleSheet('*{background-color: none;}')#(5)
まずは、「QLineEdit」が編集されている時のシグナル「textChanged」を使ってメソッド「editEvent」が実行されるようにコネクションします。(1)
メソッド「editEvent」では、編集された文字列を引数として受け取れるように定義します。(2)
入力されたテキストが空欄でなく、パスが存在するかで条件分岐を作成します。(3)
パスが存在しない場合は、「setStyleSheet」を使って、背景色を好みの色に変更するようにStyle Sheetを設定します。(4)
条件に当てはまらない場合は、背景色が無いという「none」を指定します。(5)