Перезаписывая метод mousePressEvent()
, вы должны использовать метод hitTestComplexControl()
, чтобы узнать, что QStyle::SubControl
была нажата, выдав сигнал, если он QStyle::SC_ComboBoxArrow
.
#include <QtWidgets>
class ComboBox: public QComboBox
{
Q_OBJECT
public:
using QComboBox::QComboBox;
signals:
void clicked();
protected:
void mousePressEvent(QMouseEvent *event) override{
QComboBox::mousePressEvent(event);
QStyleOptionComboBox opt;
initStyleOption(&opt);
QStyle::SubControl sc = style()->hitTestComplexControl(QStyle::CC_ComboBox, &opt, event->pos(), this);
if(sc == QStyle::SC_ComboBoxArrow)
emit clicked();
}
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
ComboBox w;
w.setEditable(true);
w.setStyleSheet("QComboBox::down-arrow{image: url(:/bulb.png);}");
QObject::connect(&w, &ComboBox::clicked, [](){
qDebug()<<"clicked";
});
w.show();
return a.exec();
}
#include "main.moc"
ХотяshowPopup()
является возможной опцией, которую можно вызывать напрямую, не нажимая стрелку вниз, например, вызывая ее напрямую: myCombo->showPopup()
, поэтому это неправильная опция.