Событие щелчка QComboBox


Я пытался получить QComboBox в PyQt5 для заполнения из таблицы базы данных. Проблема заключается в попытке найти метод, который распознает событие щелчка на нем.

В моем графическом интерфейсе мое поле со списком изначально пусто, но при нажатии на него я хочу, чтобы событие click активировало мой метод для связи с базой данных и заполнения выпадающего списка. Похоже, что до сих пор не существует встроенного обработчика событий для события click для поля со списком. Я надеюсь, что ошибаюсь в этом вопросе. Я надеюсь, что кто-нибудь сможет сказать мне, что есть способ сделать это.

Лучшая статья, которую я смог найти в своем примере использования, находится по этой ссылке, относящейся к PyQt4 QComboBox:

Я также нашел другую ссылку, которая содержит хорошее изображение QComboBox. Первый элемент, по-видимому, представляет собой метку, за которой следует Список:

3 5

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.