Search code examples
pythonpyqtpyqt5qcombobox

What is the signal for user clicks the down arrow on the QComboBox?


I need to execute a method whenever the user clicks the down arrow on the combo box. I've tried the signals listed in the documentations but none of the worked.

from PyQt5.QtWidgets import *
import sys

class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.combo = QComboBox(self)
        self.combo.signal.connect(self.mymethod)
        self.show()

    def mymethod(self):
        print('hello world')

app = QApplication(sys.argv)
win = Window()
sys.exit(app.exec_())

Solution

  • There is no signal that is emitted when the down arrow is pressed but you can create override the mousePressEvent method and verify that this element was pressed:

    import sys
    
    from PyQt5.QtCore import pyqtSignal, Qt
    from PyQt5.QtWidgets import (
        QApplication,
        QComboBox,
        QStyle,
        QStyleOptionComboBox,
        QVBoxLayout,
        QWidget,
    )
    
    
    class ComboBox(QComboBox):
        arrowClicked = pyqtSignal()
    
        def mousePressEvent(self, event):
            super().mousePressEvent(event)
            opt = QStyleOptionComboBox()
            self.initStyleOption(opt)
            sc = self.style().hitTestComplexControl(
                QStyle.CC_ComboBox, opt, event.pos(), self
            )
            if sc == QStyle.SC_ComboBoxArrow:
                self.arrowClicked.emit()
    
    
    class Window(QWidget):
        def __init__(self):
            super().__init__()
            self.combo = ComboBox()
            self.combo.arrowClicked.connect(self.mymethod)
    
            lay = QVBoxLayout(self)
            lay.addWidget(self.combo)
            lay.setAlignment(Qt.AlignTop)
    
        def mymethod(self):
            print("hello world")
    
    
    if __name__ == "__main__":
    
        app = QApplication(sys.argv)
        win = Window()
        win.show()
        sys.exit(app.exec_())