在 PyQt 中,QComboBox 控件本身并没有直接的事件或信号来指示下拉列表何时被打开(即用户点击了下拉箭头)。但是,你可以通过其他方式间接地实现这个功能,比如通过重写 QComboBox 的某些方法或者在用户与 QComboBox 交互时触发一些自定义的逻辑。
常见的方法是使用 QComboBox 的 showPopup 方法,这个方法在下拉列表被显示之前会被调用。然而,showPopup 方法是保护的(protected),所以不能直接连接一个信号到它。但可以通过继承 QComboBox 并重写 showPopup 方法来实现需求。
python
from PyQt5.QtWidgets import QComboBox
from PyQt5.QtCore import pyqtSlot
class CustomComboBox(QComboBox):
"""
重写 QComboBox
"""
def __init__(self, parent=None):
super().__init__(parent)
@pyqtSlot()
def showPopup(self):
# 在这里添加你的逻辑来更新下拉列表的内容
# 例如,从某个数据源获取新的数据项
new_data = ["New Item 1", "New Item 2", "New Item 3"]
self.clear() # 清除现有的项
self.addItems(new_data) # 添加新的项
# 调用原始的 showPopup 方法来显示下拉列表
super().showPopup()
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout
import sys
class ComboBoxExample(QWidget):
"""
正常使用改造后的ComboBox
"""
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
layout = QVBoxLayout(self)
# 使用自定义的 QComboBox
self.comboBox = CustomComboBox(self)
# 初始时添加一些项目(这些项目会在下拉列表打开时被清除并替换)
self.comboBox.addItem("Initial Item 1")
self.comboBox.addItem("Initial Item 2")
layout.addWidget(self.comboBox)
self.setWindowTitle('Custom QComboBox Example')
self.setGeometry(300, 300, 300, 200)
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = ComboBoxExample()
ex.show()
sys.exit(app.exec_())