在QT中的ui界面添加QComboBox控件,需求是实现控件的点击事件,查了资料,发现这个控件类的本身是没有点击信号可以使用的,提供的信号为
void | activated(int index) |
void | activated(const QString & text) |
void | currentIndexChanged(int index) |
void | currentIndexChanged(const QString & text) |
void | editTextChanged(const QString & text) |
void | highlighted(int index) |
void | highlighted(const QString & text) |
具体可以参考官方说明:QComboBox Class | Qt 4.8
但是QT是基于C++的面向对象,有了这个特点,我们就可以继承原来的类,然后重写里面的方法来实现基类中没有的方法,比如 clicked 事件。在QComboBox 中添加鼠标点击事件的步骤为首先新建一个类(MyComboBox),继承QComboBox类,然后在新建的类里面添加mousePressEvent事件,mousePressEvent是QT里面的鼠标点击事件,直接就能用,接着在这个mousePressEvent事件函数里面触发自定义的 mouseSingleClickd信号,这样就实现在 QComboBox 里面实现鼠标点击的事件。
代码:
新建一个MyComboBox类。
1、mycombobox.h
#ifndef MYCOMBOBOX_H
#define MYCOMBOBOX_H
#include <QComboBox>
#include <QMouseEvent>
#include "mainwindow.h"
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 mouseSingleClickd(); //自定义点击信号,在mousePressEvent事件发生时触发
};
#endif // MYCOMBOBOX_H
2、mycombobox.cpp
#include "mycombobox.h"
using namespace Ui;
MyComboBox::MyComboBox(QWidget *parent):QComboBox(parent)
{
}
MyComboBox::~MyComboBox()
{
}
void MyComboBox::mousePressEvent(QMouseEvent *event)
{
if(event->button() == Qt::LeftButton)
{
emit mouseSingleClickd(); //触发clicked信号
}
QComboBox::mousePressEvent(event); //将该事件传给父类处理,这句话很重要,如果没有,父类无法处理本来的点击事件
}
这样对 QComboBox 的重写就完成了,我们就可以使用具有鼠标点击响应的 MyComboBox 这个类了。在这里解释一下 emit,emit 是QT里面的一个关键字,意思是触发一个信号,这里的话是触发我们在 mycombobox.h 这个头文件中自定义的 mouseSingleClickd 信号。
那这个新建的 MyComboBox 应该怎么用呢?
方法1> 如果是想要在代码中直接新建的话,就是通过平时的类的实例化就行。
例如:
MyComboBox* myComboBox = new MyComboBox();
这样实例化是没有绑定父组件的,可以在父组件中通过addWidget的方式,添加这个新建的组件。
也可以在实例化的时候绑定父组件,然后进行布局、位置、大小进行设置。
方法2> 如果是直接在ui界面上面添加的话,我们可以先在ui界面添加一个原来的控件ComboBox,然后把这个控件提升为 MyComboBox 就可以使用了。
具体步骤为:打开ui界面----->>选中QComboBox控件,右击----->>选择“提升为”----->>在“提升的类名称里面”填入新建的类“MyComboBox”名称----->>点击“添加”按钮----->>再点击“提升”按钮。具体图解如下:
1、输入提升的类的名称
2、点击“添加”按钮,可以看到窗口的上面已经添加进入。
3、点击“提升”即可(添加提升时要注意mycombobox.h的名称要和实际的mycombobox.h文件名称要一致,大小写也要一致。还要在右键“改变信号/槽”-“信号”里添加一个 mouseSingleClickd 信号事件)。
4、在mouseSingleClickd事件函数中添加自己需要处理的工作内容即可。