如何知道何时单击组合框的向下箭头?
How to know when down-arrow of Combo box is clicked?
我有一个 ComboBox 并将其设置为可编辑。
QComboBox *myCombo = new QComboBox(this);
myCombo->setEditable(true);
myCombo->setStyleSheet("QComboBox::down-arrow{image: url(:/bulb.png);}");
myCombo->setCursor( QCursor( Qt::PointingHandCursor ) );
所以现在当我点击编辑字段时,没有任何反应。但我需要的是,当我点击灯泡(向下箭头)时,应该会出现一些东西(比如 table 或对话框....)。在这种情况下我如何识别这个点击事件?我查看了组合框的信号列表,但找不到任何信号。
通过覆盖 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()
所以它不是正确的选项。
一个可能的解决方案是继承 QComboBox
and reimplement 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";
}
我有一个 ComboBox 并将其设置为可编辑。
QComboBox *myCombo = new QComboBox(this);
myCombo->setEditable(true);
myCombo->setStyleSheet("QComboBox::down-arrow{image: url(:/bulb.png);}");
myCombo->setCursor( QCursor( Qt::PointingHandCursor ) );
所以现在当我点击编辑字段时,没有任何反应。但我需要的是,当我点击灯泡(向下箭头)时,应该会出现一些东西(比如 table 或对话框....)。在这种情况下我如何识别这个点击事件?我查看了组合框的信号列表,但找不到任何信号。
通过覆盖 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()
所以它不是正确的选项。
一个可能的解决方案是继承 QComboBox
and reimplement 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";
}