【问题标题】:QComboBox click eventQComboBox 点击事件
【发布时间】:2016-06-26 06:02:54
【问题描述】:

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

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

我可以在这里找到的关于我的用例的最佳文章来自此链接,指的是 PyQt4 QComboBox

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

【问题讨论】:

    标签: python events drop-down-menu pyqt5 qcombobox


    【解决方案1】:

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

    【讨论】:

    • 嗨,ekhumoro,非常感谢您在这里的意见。看来您的解决方案最接近我要寻找的解决方案。我不知道这个属性,这是有道理的,我以前从未注意到这个:void QComboBox::showPopup() ,所以感谢你让我意识到这一点。我将其作为我问题的答案。非常感谢ekhumoro!!!
    【解决方案2】:

    替代方案一:

    我们可以使用框架点击,代码是在组合框的容器(windows/dialog/etc.)中使用的

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

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

    替代方案二:

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

        self.uiComboBox.view().pressed.connect(self.handleItemPressed)
        ...
    
        def handleItemPressed(self, index):
            item = self.uiComboBox.model().itemFromIndex(index)
            print("Do something with the selected item")
    

    【讨论】:

    • 嗨 intika,这看起来很有趣,绝对是不同的视角,没有想到:Combo View()。我需要研究这个,理解这个,这个替代解决方案 2。
    • 但我不知道你所说的使用“Frame Click”的东西。我只看到 mousePressEvent 的代码。所以我不理解这个。
    • 在第一个替代方案中,我的意思是:如果在您的应用程序中,用户出于某种原因必须单击窗口(而不是组合)...然后您可以拦截该单击并做你想做的事......还有另一种选择,你可以隐藏/禁用组合框并强制用户做一些事情来显示它并使用该事件来做你想做的任何事情:)
    【解决方案3】:

    为什么要在它被激活而不是在加载窗口时填充它?

    我目前正在使用 PySide(Qt 框架的另一个 Python 绑定)开发一个应用程序,并且我在主窗口类 __init__ 函数中填充我的组合框,从许多示例来看,这似乎是要走的路。

    Zetcode 上查看“QCombobox”下的示例代码。

    【讨论】:

    • 嗨,我明白你在说什么。但是我的数据库一开始可能是空的,所以当用户第一次使用应用程序时,下拉菜单根本不会被填充。开始时数据库中的表将需要由用户通过另一个源来填充。所以我需要在程序生命周期的后期填充它。所以当窗口加载事件时我不能使用。
    • @Palu QCombobox 有一个名为“Highlighted”的信号,当光标悬停在 QCombobox 上时会发出该信号(根据我所阅读的内容)。这可能不是您正在寻找的,但它可能会完成工作?否则,是否可以创建一个函数来检测何时出现新的数据库条目并在新项目出现时添加它们,而不是在单击 QCombobox 时执行它?
    • 嗨,Pkarls,这是一个关于函数检测何时出现新条目的有趣想法。我会考虑的。我只是觉得奇怪的是,PyQt 人似乎没有为 ComboBox 考虑这个基本事件。
    • @Palu 是的,我支持你。
    猜你喜欢
    • 2020-05-06
    • 2012-05-17
    • 2018-12-13
    • 2023-03-27
    • 1970-01-01
    • 2012-12-07
    • 2012-09-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多