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这儿已经显示你的控件类是你自己定义的类啦。
大功告成!!!哈哈。
接下来还有一个关于自定义控件的需求,后续再发。
请各位大佬多多指教!