Qt下的自定义控件——通过继承QComboBox并重写event来实现想要的效果

1.需求

    在项目当中呢,需要做一个根据QComboBox的子项显示相应数据的功能,这个很简单,通过QComboBox自有的activated

信号就能解决。但是呢,又需要在切换QComboBox子项时,把当前子项相关的那部分数据记录下来,否则切换一次子项再切换回来之前修改的数据就白做了。

2.需求分析

    首先一点,这个需求呢,是想要在你切换子项这个动作发生或者将要发生的时候,保存当下的数据。

    如果使用activated信号的话,保存的肯定切换子项后的数据。所以我想的是使用QComboBox的clicked信号来触发保存数据的槽函数,毕竟你要切换子项,肯定得点击QComboBox控件才行。

    但是,QComboBox压根儿就没有clicked信号,所以怎么办呢,自己动手来吧。

3.实现过程

    首先,常见一个类CComboBox,该类继承QComboBox ,我平时不喜欢把.h文件的代码也贴出来是因为没有必要,今天这种情况感觉还是贴出来比较好,哈哈。

#include <QComboBox> //导入头文件,如果你连基类的头文件都不导入,继承谁啊
#include <QMouseEvent> //导入鼠标事件的头文件,你没有这个头文件,你点鼠标人家也不给你干活的

class CComboBox : public QComboBox //这个格式可以参照其他的,因为你只写基类名可能会缺少一些东西,
{
    Q_OBJECT  //不写这个没办法用信号槽机制,必须得写
public:
    explicit CComboBox(QWidget *parent = 0);
        ~CComboBox();
    protected:
        virtual void mousePressEvent(QMouseEvent *e);  //重写鼠标点击事件

    signals:
        void clicked();  //自定义点击信号,在mousePressEvent事件发生时触发,名字无所谓,随自己喜欢就行
};

   然后是实现的部分

#include "CComboBox.h"

CComboBox::CComboBox(QWidget *parent):QComboBox(parent){

}

CComboBox::~CComboBox(){

}

void CComboBox::mousePressEvent(QMouseEvent *e){
    if(e->button()==Qt::LeftButton)//判断是不是鼠标左键按下了
        emit clicked();//是的话就发送咱们定义的信号
    QComboBox::mousePressEvent(e);//如果你不写这一句,事件传递到上一步就停止,
//就不接着向下发了,父类也就没办法处理点击事件了
}

4.使用方法

因为是继承自QComboBox,所以可以在代码中按照QComboBox的使用方法使用,我这里重点说一下在UI中如何使用自定义的控件。

首先,你得先拖一个QComboBox,

然后右键,点击【提升为】,

将你自己定义的类名和头文件填进去,然后点击【添加】,

然后你的类就添加进去了,勾选之后点击【提升】就OK啦!

然后你就能看到UI这儿已经显示你的控件类是你自己定义的类啦。

大功告成!!!哈哈。

接下来还有一个关于自定义控件的需求,后续再发。

请各位大佬多多指教!

猜你喜欢

转载自blog.csdn.net/menger3388/article/details/85115023