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这儿已经显示你的控件类是你自己定义的类啦。

大功告成!!!哈哈。

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

请各位大佬多多指教!

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值