2017-12-15 10 views
0

QCompleterをpysideで動作させる方法は、StackOverflowのタグエディタの動作と似ていますか?ユーザーが単語を入力できる場所にスペースがある場合、オートコンプリートに一致する単語を表示させることができますか?QCompleter stackoverflowタグフィールドのような複数項目をサポートする

それは私が何をしたいんようにこの投稿は、ようだが、それはあなたが最後の文字列を取得するロジックを実装する必要があり、これは作るために単語になりますC++に How to force QCompleter to check second word in QLineEdit

enter image description here

import os 
import sys 
import json 
from PySide import QtCore, QtGui 


class ExampleWindow(QtGui.QMainWindow): 
    def __init__(self, parent=None): 
     super(ExampleWindow, self).__init__(parent) 
     self.resize(300, 200) 

     self.strings_model = QtGui.QStringListModel() 
     self.get_data(self.strings_model) 
     completer = QtGui.QCompleter() 
     completer.setCaseSensitivity(QtCore.Qt.CaseInsensitive) 
     completer.setModel(self.strings_model) 

     self.ui_input = QtGui.QLineEdit() 
     self.ui_input.setCompleter(completer) 
     self.ui_input.setPlaceholderText('enter description...') 

     self.ui_tags_list = QtGui.QListView() 
     self.ui_tags_list.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers) 
     self.ui_tags_list.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection) 
     self.ui_tags_list.setModel(self.strings_model) 


     # main layout 
     main_layout = QtGui.QVBoxLayout() 
     main_layout.setContentsMargins(5,5,5,5) 
     main_layout.setSpacing(5) 
     main_layout.addWidget(self.ui_input) 
     main_layout.addWidget(self.ui_tags_list) 

     main_widget = QtGui.QWidget() 
     main_widget.setLayout(main_layout) 
     self.setCentralWidget(main_widget) 

     # connections 
     self.ui_input.returnPressed.connect(self.input_entered) 


    def get_data(self, model): 
     model.setStringList(["Animals", "Dogs", "Birds", "Cats", "Elephant", "Zebra"]) 


    def append_tag(self, val): 
     if not val: 
      return False 

     if val.lower() in [x.lower() for x in self.strings_model.stringList()]: 
      return False 

     self.strings_model.insertRow(self.strings_model.rowCount()) 
     index = self.strings_model.index(self.strings_model.rowCount()-1) 
     self.strings_model.setData(index, val) 


    def input_entered(self): 
     print 'selected word from drop down should be added to lineEdit' 


def main(): 
    app = QtGui.QApplication(sys.argv) 
    ex = ExampleWindow() 
    ex.show() 
    sys.exit(app.exec_()) 


if __name__ == '__main__': 
    main() 

答えて

1

ですそれらを追加するために、私は見ていないよ

class LineEdit(QtGui.QLineEdit): 
    def __init__(self, *args, **kwargs): 
     QtGui.QLineEdit.__init__(self, *args, **kwargs) 
     self.multipleCompleter = None 

    def keyPressEvent(self, event): 
     QtGui.QLineEdit.keyPressEvent(self, event) 
     if not self.multipleCompleter: 
      return 
     c = self.multipleCompleter 
     if self.text() == "": 
      return 
     c.setCompletionPrefix(self.cursorWord(self.text())) 
     if len(c.completionPrefix()) < 1: 
      c.popup().hide() 
      return 
     c.complete() 

    def cursorWord(self, sentence): 
     p = sentence.rfind(" ") 
     if p == -1: 
      return sentence 
     return sentence[p + 1:] 

    def insertCompletion(self, text): 
     p = self.text().rfind(" ") 
     if p == -1: 
      self.setText(text) 
     else: 
      self.setText(self.text()[:p+1]+ text) 

    def setMultipleCompleter(self, completer): 
     self.multipleCompleter = completer 
     self.multipleCompleter.setWidget(self) 
     completer.activated.connect(self.insertCompletion) 


def main(): 
    app = QtGui.QApplication(sys.argv) 
    w = LineEdit() 
    completer = QtGui.QCompleter(["Animals", "Dogs", "Birds", "Cats", "Elephant", "Zebra"]) 
    completer.setCaseSensitivity(QtCore.Qt.CaseInsensitive) 
    w.setMultipleCompleter(completer) 
    w.show() 
    sys.exit(app.exec_()) 


if __name__ == '__main__': 
    main() 
+0

setCompletionPrefix()通じQCompleteでフィルタリストに追加するだけです。リストはそこにあるので、入力可能なアイテムが分かります。 – JokerMartini

+0

@JokerMartini AniがQLineEditに書き込まれているとしましょうオートコンプリート、つまり、どのキーが押されなければならないのですか?SOはオートコンプリートではなく、提案のみを表示します。あなたが入力した場合、それは完了しません。 – eyllanesc

+0

例4と呼ばれるこのWebページに表示されている例のように動作します。https://sean.is/poppin/tags/ – JokerMartini

関連する問題