パス入力のオートコンプリートの作り方!!

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)

実行結果

6 件のコメント

    • >>Co,さん
      コメントありがとうございます!!
      空にするっというのは、「self.setStyleSheet(”)」っという事でしょうか!?

      • そうですね。noneにすると、親から継承してるstyleSheetがなくなっちゃいました。
        話は変わりますが、今、QDirModelの部分が白バック(default)で、親のstyle継承しなくて困ってます。笑

        • >>Co,さん
          親Widgetのところまで、頭が回っていませんでした、、、
          確かに、noneにしてしまうと上書きされてしまいますね(;・∀・)
          でも、逆に継承されない場合もあると、、、orz

          • >>Co, さん
            もしかしたら、「setCompleter」で登録してるだけなので
            親子化してるわけでなく、Style Sheetが継承されないっとかあるかもしれないですね(;・∀・)

          • Standaloneで黒バックにしてるのに、ディレクトリの一覧選ぶとこだけ白で悲しい状態です…。笑

  • Co, へ返信する コメントをキャンセル

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です