QComboBox单击事件


问题内容

我一直在尝试QComboBox从数据库表中填充PyQt5。问题是试图找到一种识别点击事件的方法。

在我的GUI中,我的组合框最初是空的,但是在单击它时,我希望单击事件能够激活我的方法以与数据库进行通信并填充下拉列表。到目前为止,似乎没有针对组合框的单击事件的内置事件处理程序。我希望我做错了。我希望有人能够告诉我,有一种方法可以做到这一点。

我在用例上能找到的最好的文章是从此链接引用PyQt4的QComboBox

我还找到了另一个链接,其中包含一个漂亮的图片QComboBox。第一个元素似乎是标签,后跟一个列表:


问题答案:

您可以重写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,以便从数据库自动更新项目。