QT自定义继承控件类添加信号和槽
原因:在使用QT comboBox控件时发现没有点击事件(clicked()),翻阅博客查找到此类解决办法,本文介绍使用QTcreator中ui设计直接生成信号对应槽的方法,不用在程序内使用connect函数联系信号和槽的方式,前一种在参考博客评论区有大神提到,后一种方法在参考博客中有具体介绍,特以为记。
方法总结
1、新建mycombobox.h文件,编写MycomboBox类继承QComboBox类,添加鼠标事件(mousePressEvent)和点击信号clicked()。
#ifndef MYCOMBOBOX_H
#define MYCOMBOBOX_H
#include <QComboBox>//QComboBox类头文件
#include <QMouseEvent>//QMouseEvent鼠标事件头文件
class MycomboBox : public QComboBox//继承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
2、新建mycombobox.cpp文件,编写MycomboBox构造函数继承QComboBox构造函数,编写鼠标事件函数,点击槽函数利用QT设计功能添加(后续步骤处理)。
#include "mycombobox.h"
MycomboBox::MycomboBox(QWidget *parent) :
QComboBox(parent)//继承QComboBox构造函数
{}
MycomboBox::~MycomboBox()
{}
//鼠标活动触发事件
void MycomboBox::mousePressEvent(QMouseEvent *event)
{
if(event->button() == Qt::LeftButton)//判断事件为鼠标左键点击事件
{
emit clicked(); //发出clicked信号
}
//将该事件传给父类处理,这句话很重要,如果没有,父类无法处理本来的点击事件
//QComboBox::mousePressEvent(event);
//如果不想父类触发也可以注释掉,写一个信号或变量保存该事件,等点击事件处理完毕再执行
}
上面两部分关于类的构造函数编写是否带有父类参数,取决于原控件使用时是否有父类参数,作者这里设计生成的应用代码带有父类参数,因此为了与原代码一致,自定义类的构造函数也定义为带有父类参数,否则会报没有匹配的错。
3、进入QT设计功能界面,将原comboBox控件提升为自己创建的MycomboBox类
具体步骤为:打开ui界面----->>选中QComboBox控件,右击----->>选择“提升为”----->>在“提升的类名称”里面填入新建的类“MyComboBox”名称----->>在“头文件”里面填写“mycombobox.h”(都要注意大小写,不要写错了)----->>点击“添加”按钮----->>再点击“提升”按钮。
提升后控件类名会变成自定义类的名称“MyComboBox”。
4、给提升后的控件添加clicked()信号和click()槽
具体步骤为:打开ui界面----->>选中QComboBox控件,右击----->>选择“改变信号/槽”----->>在“信号文本栏”点击“+”按钮----->>写入clicked()(注意:这里应当和来自定义类中的信号名称一致)----->>点击“OK按钮”保存。
5、再次右击控件,选择“转到槽”弹窗里就出现所添加的信号选项了,选中后会自动连接到生成的槽函数,就可以愉快的编写想要的效果了。