Найти - Пользователи
Полная версия: Выпадающий список QtGui.QComboBox(self)
Начало » GUI » Выпадающий список QtGui.QComboBox(self)
1
xenon
Здрасте, уважаемые Гуру Питона! Вопрос по PyQt.
Подскажите пожалуйста опцию, позволяющую при вводе текста в поле - QtGui.QComboBox(self) и нажатии на стрелке справа, чтобы выпадающий список начинался или оказывался “рядом” с введенным текстом, т.е. максимально близким совпадением.
Непонятно описал проблему ((
Вот пример: есть список фамилий: Иванов, Петров, Сидоров - они находятся в списке. Я ввожу начальные буквы фамилии “Иванов”, типа - “Ива” и щелкаю на стрелке справа, то указатель должен предложить мне в первую очередь фамилию “Иванов” для заполнения. По умолчанию, если я щелкаю на стрелке справа, то выпадающий список начинается сначала ((
Чтоб не прослыть полным лентяем-трутнем привожу кусок своего кода по добавлению виджетов и настройке некоторых опций.

Заранее большое спасибо!

        i = 0
        for j in self.names_label:
            self.label[i] =  QtGui.QLabel( j )
            grid.addWidget(self.label[i],pos_label[i][0],pos_label[i][1])
            
            self.combo[i] = QtGui.QComboBox(self)
            grid.addWidget(self.combo[i],pos_label[i][0],pos_label[i][1]+1, 1, 3)
            self.combo[i].setEditable(True)
            if i >= 1 :
                self.combo[i].setInsertPolicy (0)
            self.combo[i].setMaxVisibleItems(5)
            i += 1
vrabey
вот такое наколдовал
import sys
from PyQt4 import QtGui, QtCore
class Example(QtGui.QWidget):
    def __init__(self):
        super(Example, self).__init__()
        self.names = [u"Петров", u"Сидоров", u"Иванов", u"Ивановa"]
        self.index_old = 0
        self.index_cur = 0
        self.combo = QtGui.QComboBox(self)
        self.combo.setEditable(True)
        self.comp = QtGui.QCompleter(self.completer)
        #self.combo.setCompleter(self.comp)
        self.combo.editTextChanged.connect(self.text_ch)
        self.add_names()
    @property
    def completer(self):
        completerList = QtCore.QStringList()
        for name in self.names:
            completerList.append(QtCore.QString(name))
        return completerList
    def add_names(self):
        for name in self.names:
            self.combo.addItem(name)
    def text_ch(self, s):
        name = unicode(s)
        self.combo.setEditText(name.capitalize())
        try:
            self.index_cur = self.names.index(name)
        except:
            pass
        else:
            if self.index_cur != self.index_old:
                self.combo.setCurrentIndex(self.index_cur)
            self.index_old = self.index_cur
def main():
    app = QtGui.QApplication(sys.argv)
    ex = Example()
    ex.show()
    sys.exit(app.exec_())
if __name__ == '__main__':
    main()

оно то работает но наверняка есть какой-то Правильный способ
xenon
vrabey
вот такое наколдовал
Большое спасибо за предложенное решение!
Буду разбираться в выложенном коде!
оно то работает но наверняка есть какой-то Правильный способ
- вот и я думал, что есть готовое решение данной задачи, но если никто больше не откликнулся, возможно его и нет (((
Rodegast
> оно то работает но наверняка есть какой-то Правильный способ
> вот и я думал, что есть готовое решение данной задачи, но если никто больше не откликнулся, возможно его и нет (((

Его прость не может не быть… Оно где-то есть… Ой да вот же оно!
self.combo.editTextChanged.connect(self.combo.findText)
vrabey
Rodegast
self.combo.editTextChanged.connect(self.combo.findText)
а можете объяснить что делает эта строчка?
вернее как её использовать для решения задачи:
xenon
ввожу начальные буквы фамилии “Иванов”, типа - “Ива” и щелкаю на стрелке справа, то указатель должен предложить мне в первую очередь фамилию “Иванов” для заполнения
хочется разобраться
Rodegast
> вернее как её использовать для решения задачи

Я думал что вы сами с таким разберётесь.
import sys
from PyQt4 import QtGui, QtCore
class Example(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        self.combo = QtGui.QComboBox(self)
        self.combo.setEditable(True)
        self.combo.editTextChanged.connect(self.combo.findText)
        self.combo.addItems([u"Петров", u"Сидоров", u"Иванов", u"Ивановa"])
if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    ex = Example()
    ex.show()
    sys.exit(app.exec_())
xenon
Его прость не может не быть… Оно где-то есть… Ой да вот же оно!
- Большое спасибо за решение!!!
Вот только смущает поведение - срабатывает со второго раза, т.е.: при вводе текста “Ива” и щелчке на стрелку - указатель предлагает выбрать первое значение из списка (т.е. “Петров”), а если щелкнуть второй раз на стрелку - то все в норме, указатель предлагает выбрать именно “ближайшее” значение - “Иванов”.
Rodegast
> Вот только смущает поведение - срабатывает со второго раза

Вот вариант который будет работать с первого раза.
import sys
from PyQt4 import QtGui, QtCore
class Example(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        self.combo = QtGui.QComboBox(self)
        self.combo.setEditable(True)
        self.combo.editTextChanged.connect(self.findText)
        self.combo.addItems([u"Петров", u"Сидоров", u"Иванов", u"Ивановa"])
    def findText(self, s):
        index=self.combo.findText(s)
        if index > -1:
            self.combo.setCurrentIndex(index)
if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    ex = Example()
    ex.show()
    sys.exit(app.exec_())
xenon
Вот вариант который будет работать с первого раза.
- Да, спасибо большое! Все отлично!
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB