Когда QComboBox доступен для редактирования

В приведенном ниже коде создаются QComboBox и QPushButton, назначенные одному и тому же макету. Поле со списком настроено на редактирование, поэтому пользователь может ввести новое значение элемента списка со списком. Если пользователь нажмет клавишу Tab (вместо Enter), новое значение не будет добавлено в поле со списком. Вопрос: Как убедиться, что элементы ComboBox обновляются новым значением, даже если пользователь покидает ComboBox с помощью клавиши Tab?

введите здесь описание изображения

from PyQt4 import QtGui

def comboActivated(arg=None):
    print '\n ...comboActivated: %s'%arg

widget = QtGui.QWidget()
layout = QtGui.QVBoxLayout()
widget.setLayout(layout)
combo = QtGui.QComboBox()
combo.setEditable(True)
combo.addItems(['One','Two','Three'])
combo.activated.connect(comboActivated)
layout.addWidget(combo)
layout.addWidget(QtGui.QPushButton('Push'))
widget.show()

person alphanumeric    schedule 30.08.2016    source источник


Ответы (1)


Когда пользователь редактирует текст в поле, выдается сигнал editTextChanged() с отредактированным текстом в качестве аргумента. Кроме того, когда сам виджет теряет фокус, например, когда пользователь набирает Tab для перехода к кнопке, виджет излучает сигнал focusOutEvent(). Аргументом для этого сигнала является QFocusEvent, который вы можете запросить по причине потери фокуса. Метод reason() события вернет Qt.TabFocusReason, например, если пользователь нажмет кнопку Tab, чтобы выйти из виджета.

Вы можете подключить слот к любому из этих сигналов (или к обоим), чтобы, когда пользователь покидает виджет после редактирования текста, вы обрабатывали его и добавляли в список значений поля.

Вы также можете изучить класс QValidator и его подклассы, которые вы присоединяете к виджетам с редактируемым текстом, и определить типы допустимых входных данных для виджета (например, целые числа, текст и т. д.). Это лучший и самый простой способ проверить ввод пользователя для редактируемых виджетов.

person bnaecker    schedule 30.08.2016
comment
Спасибо! editTextChanged() в данном случае достаточно! - person alphanumeric; 31.08.2016