Форум сайта python.su
Здрасте, уважаемые Гуру Питона! Вопрос по 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
Офлайн
вот такое наколдовал
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()
Отредактировано vrabey (Сен. 27, 2014 11:37:25)
Офлайн
vrabeyБольшое спасибо за предложенное решение!
вот такое наколдовал
оно то работает но наверняка есть какой-то Правильный способ- вот и я думал, что есть готовое решение данной задачи, но если никто больше не откликнулся, возможно его и нет (((
Офлайн
> оно то работает но наверняка есть какой-то Правильный способ
> вот и я думал, что есть готовое решение данной задачи, но если никто больше не откликнулся, возможно его и нет (((
Его прость не может не быть… Оно где-то есть… Ой да вот же оно!
self.combo.editTextChanged.connect(self.combo.findText)
Отредактировано Rodegast (Окт. 2, 2014 21:02:53)
Офлайн
Rodegastа можете объяснить что делает эта строчка?
self.combo.editTextChanged.connect(self.combo.findText)
xenonхочется разобраться
ввожу начальные буквы фамилии “Иванов”, типа - “Ива” и щелкаю на стрелке справа, то указатель должен предложить мне в первую очередь фамилию “Иванов” для заполнения
Офлайн
> вернее как её использовать для решения задачи
Я думал что вы сами с таким разберётесь.
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 (Окт. 2, 2014 22:59:21)
Офлайн
> Вот только смущает поведение - срабатывает со второго раза
Вот вариант который будет работать с первого раза.
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_())
Отредактировано Rodegast (Окт. 2, 2014 23:27:22)
Офлайн
Вот вариант который будет работать с первого раза.- Да, спасибо большое! Все отлично!
Офлайн