关于python:QComboBox click事件

QComboBox click event

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

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

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

  • pyqt4组合框中的下拉事件/回调

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

  • 从QComboBox弹出菜单中捕获按下鼠标按钮的信号

您可以重写showPopup方法以实现此目的,无论下拉列表如何打开(即通过鼠标,键盘或快捷方式),该方法都将起作用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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:

我们可以使用框架单击,该代码将在组合框的容器中使用(windows / dialog / etc。)

1
2
def mousePressEvent(self, event):
        print("Hello world !")

1
2
def mousePressEvent():
        print("Hello world !")

替代解决方案II:

我们可以将处理程序连接到组合视图的按下信号

1
2
3
4
5
6
    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(Qt框架的另一个Python绑定)开发应用程序,并在mainwindow类__init__函数中填充组合框,从许多示例来看,这似乎是一个可行的方法。

在Zetcode的" QCombobox"下查看示例代码。