Как узнать, когда нажата стрелка вниз поля со списком? - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть ComboBox и установите его для редактирования.

QComboBox *myCombo = new QComboBox(this);
myCombo->setEditable(true);
myCombo->setStyleSheet("QComboBox::down-arrow{image: url(:/bulb.png);}");
myCombo->setCursor( QCursor( Qt::PointingHandCursor ) );

enter image description here

Так что теперь, когда я нажимаю на поле редактирования, ничего не происходит.Но что мне нужно, так это то, что когда я нажимаю на лампочку (стрелка вниз), должно появиться что-то (например, таблица или диалог ....).Как я могу распознать это событие клика в этом случае?Я посмотрел на список сигналов для поля со списком, но не смог найти никакого сигнала для этого.

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Возможное решение - создать подкласс QComboBox и переопределить виртуальный метод showPopup():

.h :

#ifndef COMBOBOXDROPDOWN_H
#define COMBOBOXDROPDOWN_H

#include <QComboBox>
#include <QDebug>

class ComboBoxDropDown : public QComboBox
{
public:
    ComboBoxDropDown(QWidget *parent = nullptr);
    void showPopup() override;    
};

#endif // COMBOBOXDROPDOWN_H

.cpp :

#include "comboboxdropdown.h"

ComboBoxDropDown::ComboBoxDropDown(QWidget *parent)
    : QComboBox (parent)
{    
}

void ComboBoxDropDown::showPopup()
{
    //QComboBox::showPopup();
    qDebug() << "Do something";
}
0 голосов
/ 27 февраля 2019

Перезаписывая метод 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(), поэтому это неправильная опция.

...