2016-03-11 328 views
3

我一直在試圖讓一個PyQt5到QComboBox成爲從數據庫表填充。問題是試圖找到一種方法來識別點擊事件。QComboBox click事件

在我的GUI,我的組合框最初是空的,但在點擊它我希望click事件激活我的方法傳遞給數據庫和填充下拉列表。目前看來,組合框的點擊事件沒有內置的事件處理程序。我希望我錯了。我希望有人能夠告訴我,有一種方法可以做到這一點。

我能找到我的用例這裏的最好的文章是從這個鏈接引用PyQt4的QComboBox

我還發現,包含的一個很好的形象另一個鏈接QComboBox。 第一個元素似乎是一個標籤,後面的列表:

回答

4

可以重寫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,以便項目自動從數據庫更新。

+0

HI ekhumoro,真的很感謝你在這裏輸入。看來你的解決方案是最接近我將要尋找的。我沒有意識到這個屬性,這是有道理的,我從來沒有注意到這一點:void QComboBox :: showPopup(),所以感謝讓我意識到這一點。我將這個作爲我的問題的答案。非常感謝ekhumoro! – Palu

0

你爲什麼要來填充它時,它的啓動而加載時,窗口比?

我目前正在用PySide(Qt框架中的另一個Python綁定)開發一個應用程序,並且我在主窗口類__init__函數中填充我的組合框,這似乎是一個很好的例子。

看在以上下Zetcode「QCombobox」示例代碼。

+0

嗨,我明白你在說什麼。但是我的數據庫一開始可能是空的,所以當用戶第一次使用該應用程序時,下拉列表根本不會填充。開始時數據庫中的表格需要由用戶通過另一個來源填充。所以我需要在程序的生命週期中稍後使用它。所以我不能在窗口加載事件時使用。 – Palu

+0

@Palu QCombobox有一個名爲「Highlighted」的信號,當光標懸停在QCombobox時發出(根據我讀過的內容)。 這可能不是你正在尋找的東西,但它可能完成工作? 否則,是否有可能創建一個函數來檢測何時發生新的數據庫條目,並在添加新條目時添加新條目,而不是在點擊QCombobox時添加新條目? – Pkarls

+0

嗨Pkarls,這是一個有趣的想法關於函數檢測何時發生新條目。我會考慮這一點。我覺得奇怪的是,PyQt的人似乎沒有想到ComboBox的這個基本事件。 – Palu