PySide2 QComboBox фильтрация элементов - PullRequest
0 голосов
/ 17 ноября 2018

У меня проблема.

Я реализовал функцию фильтрации с использованием QComboBox в 3dsMax 2016.

А теперь я хочу реализовать функцию фильтрации в 3dsMax 2018.

Итак, я изменил свой код. PySide to PySide2.

Функция фильтрации работает. но печатать не видно. Это мой код

from PySide2.QtWidgets import QComboBox, QApplication, QCompleter, QLineEdit
from PySide2.QtCore import Qt, QSortFilterProxyModel
from PySide2.QtGui import QStandardItemModel,QStandardItem

from PySide2 import QtWidgets, QtCore, QtGui
import MaxPlus

class SuperDuperText(QtWidgets.QLineEdit):
    def focusInEvent(self, event):
        MaxPlus.CUI.DisableAccelerators()

    def focusOutEvent(self, event):
        MaxPlus.CUI.EnableAccelerators()

class ExtendedCombo( QtWidgets.QComboBox ):

    def __init__( self,  parent = None):
        super( ExtendedCombo, self ).__init__( parent )

        self.setFocusPolicy( Qt.StrongFocus )
        self.setEditable(True)
        self.completer = QCompleter( self )

        self.completer.setCompletionMode( QCompleter.UnfilteredPopupCompletion )
        self.pFilterModel = QSortFilterProxyModel( self )
        self.pFilterModel.setFilterCaseSensitivity( Qt.CaseInsensitive )

        self.completer.setPopup( self.view() )
        self.setCompleter( self.completer )
        # SuperDuperText().textEdited[unicode].connect( self.pFilterModel.setFilterFixedString )
        # self.lineEdit().textEdited[unicode].connect( self.pFilterModel.setFilterFixedString )
        # print self.lineEdit().echoMode() is return Normal 

        self.lineEdit().textEdited[unicode].connect(
        self.pFilterModel.setFilterFixedString)
        self.completer.activated.connect(self.setTextIfCompleterIsClicked)

    def setModel( self, model ):
        super(ExtendedCombo, self).setModel( model )
        self.pFilterModel.setSourceModel( model )
        self.completer.setModel(self.pFilterModel)

    def setModelColumn( self, column ):
        self.completer.setCompletionColumn( column )
        self.pFilterModel.setFilterKeyColumn( column )
        super(ExtendedCombo, self).setModelColumn( column )

    def view( self ):
        return self.completer.popup()

    def index( self ):
        return self.currentIndex()

    def setTextIfCompleterIsClicked(self, text):
        if text:
             index = self.findText(text)
             self.setCurrentIndex(index)

    def focusInEvent(self, event):
         MaxPlus.CUI.DisableAccelerators()

    def focusOutEvent(self, event):
         MaxPlus.CUI.EnableAccelerators()


class SuperDuperUI(QtWidgets.QDialog):
    def __init__(self, parent=MaxPlus.GetQMaxMainWindow()):
        super(SuperDuperUI, self).__init__(parent)
        self.setWindowTitle("Sample UI")
        self.initUI()

    def initUI(self):
        mainLayout = QtWidgets.QVBoxLayout()

        maxScriptsDir = MaxPlus.PathManager.GetScriptsDir()
        testLabel = QtWidgets.QLabel("Your scripts dir is: " + maxScriptsDir)
        mainLayout.addWidget(testLabel)

        testBtn = QtWidgets.QPushButton("This does nothing.")
        mainLayout.addWidget(testBtn)

        testEdit = SuperDuperText()
        testEdit.setPlaceholderText("You can type in here if you like...")
        mainLayout.addWidget(testEdit)

        model = QStandardItemModel()

        for i, word in enumerate(['hola', 'adios', 'hello', 'good bye']):
            item = QStandardItem(word)
            model.setItem(i, 0, item)

        combo = ExtendedCombo()
        combo.setModel(model)
        combo.setModelColumn(0)
        mainLayout.addWidget(combo)

        self.setLayout(mainLayout)

if __name__ == "__main__":
    ui = SuperDuperUI()
    ui.show()

Я думаю, что QLineedit QCombobox имеет проблему с фокусом. Может быть, ......

Я попытался переопределить qlineedit qcombobox в SuperDuperText, но не смог.

Спасибо всем, кто прочитал мою проблему.

...