Событие щелчка QComboBox
Я пытался получить QComboBox
в PyQt5 для заполнения из таблицы базы данных. Проблема заключается в попытке найти метод, который распознает событие щелчка на нем.
В моем графическом интерфейсе мое поле со списком изначально пусто, но при нажатии на него я хочу, чтобы событие click активировало мой метод для связи с базой данных и заполнения выпадающего списка. Похоже, что до сих пор не существует встроенного обработчика событий для события click для поля со списком. Я надеюсь, что ошибаюсь в этом вопросе. Я надеюсь, что кто-нибудь сможет сказать мне, что есть способ сделать это.
Лучшая статья, которую я смог найти в своем примере использования, находится по этой ссылке, относящейся к PyQt4 QComboBox
:
Я также нашел другую ссылку, которая содержит хорошее изображение QComboBox
.
Первый элемент, по-видимому, представляет собой метку, за которой следует Список:
3 ответа:
Для этого можно переопределить метод showPopup, который будет работать независимо от того, как открывается раскрывающийся список (например, с помощью мыши, клавиатуры или ярлыков):
from PyQt5 import QtCore, QtWidgets class ComboBox(QtWidgets.QComboBox): popupAboutToBeShown = QtCore.pyqtSignal() def showPopup(self): self.popupAboutToBeShown.emit() super(ComboBox, self).showPopup() class Window(QtWidgets.QWidget): def __init__(self): super(Window, self).__init__() self.combo = ComboBox(self) self.combo.popupAboutToBeShown.connect(self.populateConbo) layout = QtWidgets.QVBoxLayout(self) layout.addWidget(self.combo) def populateConbo(self): if not self.combo.count(): self.combo.addItems('One Two Three Four'.split()) if __name__ == '__main__': import sys app = QtWidgets.QApplication(sys.argv) window = Window() window.show() sys.exit(app.exec_())
Однако, для вашего конкретного случая использования, я думаю, что лучшим решением может быть установка QSqlQueryModel в поле со списком, так что элементы обновляются из базы данных автоматически.
Альтернативное Решение I:
Мы можем использовать frame click, код должен использоваться в контейнере поля со списком (windows / dialog / etc.)
def mousePressEvent(self, event): print("Hello world !")
Или
def mousePressEvent(): print("Hello world !")
Альтернативное решение II:
Мы могли бы подключить обработчик к нажатому сигналу вида комбо
self.uiComboBox.view().pressed.connect(self.handleItemPressed) ... def handleItemPressed(self, index): item = self.uiComboBox.model().itemFromIndex(index) print("Do something with the selected item")
Почему вы хотите заполнить его, когда он активирован, а не когда окно загружено?
В настоящее время я разрабатываю приложение с PySide (еще одна привязка Python для фреймворка Qt), и я заполняю свои comboboxes в функции mainwindow class
__init__
, что, судя по многим примерам, кажется правильным.Посмотрите на пример кода в разделе "QCombobox" по адресу Zetcode.