Qt 上QComboBox实现鼠标点击触发
-
前段时间在Qt上做东西的时候,提出了一个奇怪的需求(至少我觉得是挺奇怪的)。让 ui 中的 QComboBox 控件有点击交互,QComboBox 控件其实就是一个下拉框样式的控件,这个下拉框提供的交互是点击之后会展开所有的选项,用户选择后将会发出信号,也就是选择改变的信号,设计者接收这个信号到槽就可以捕捉用户的选择更改了。然而,要求实现的是点击此框,即会触发一次所选项的更新。
在该控件的信号和槽查找之后并没有找到相应的信号和槽,经过查找资料发现并没有这个功能的支持。但是这个功能还是可以自己实现的, 比较简单,在此记录一下。- 新增
MyComboBox.h
#ifndef MYCOMBOBOX_H #define MYCOMBOBOX_H #include <QComboBox> #include <QMouseEvent> class MyComboBox : public QComboBox { Q_OBJECT //只有加入Q_OBJECT,才能使用信号signal和槽slot的机制 public: explicit MyComboBox(QWidget *parent = 0); ~MyComboBox(); protected: virtual void mousePressEvent(QMouseEvent *e); //添加鼠标点击事件 signals: void clicked(); //自定义点击信号,在mousePressEvent事件发生时触发 }; #endif // MYCOMBOBOX_H
- 新增
MyComboBox.cpp
#include "mycombobox.h" MyComboBox::MyComboBox(QWidget *parent):QComboBox(parent) { } MyComboBox::~MyComboBox() { } void MyComboBox::mousePressEvent(QMouseEvent *event) { if(event->button() == Qt::LeftButton) { emit clicked(); //触发clicked信号 } QComboBox::mousePressEvent(event); //将该事件传给父类处理,这句话很重要,如果没有,父类无法处理本来的点击事件 }
- 如何调用?
在 ui 设计界面右击一个QComboBox,选择“提升为”,在“提升的类名称里面”填入新建的类“MyComboBox”名称,点击“添加”按钮,再点击“提升”按钮,就OK了。
①可以通过函数调用
在**.h
中增加 一个 slot 函数, 再用connect
连接信号和槽就可以了!
connect(ui->comboBox, SIGNAL(clicked()), this, SLOT(on_comboBox_clicked()));
②在ui界面右击控件跳转到槽
Qt 是个好东西。
- 新增