QT自定义继承控件类添加信号和槽

QT自定义继承控件类添加信号和槽

原因:在使用QT comboBox控件时发现没有点击事件(clicked()),翻阅博客查找到此类解决办法,本文介绍使用QTcreator中ui设计直接生成信号对应槽的方法,不用在程序内使用connect函数联系信号和槽的方式,前一种在参考博客评论区有大神提到,后一种方法在参考博客中有具体介绍,特以为记。

方法总结

1、新建mycombobox.h文件,编写MycomboBox类继承QComboBox类,添加鼠标事件(mousePressEvent)点击信号clicked()

#ifndef MYCOMBOBOX_H
#define MYCOMBOBOX_H

#include //QComboBox类头文件
#include //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”。
QT自定义继承控件类添加信号和槽_第1张图片

4、给提升后的控件添加clicked()信号click()槽
具体步骤为:打开ui界面----->>选中QComboBox控件,右击----->>选择“改变信号/槽”----->>在“信号文本栏”点击“+”按钮----->>写入clicked()(注意:这里应当和来自定义类中的信号名称一致)----->>点击“OK按钮”保存。
QT自定义继承控件类添加信号和槽_第2张图片

5、再次右击控件,选择“转到槽”弹窗里就出现所添加的信号选项了,选中后会自动连接到生成的槽函数,就可以愉快的编写想要的效果了。
QT自定义继承控件类添加信号和槽_第3张图片

参考博客

[1] QT中ui界面的控件QComboBox实现鼠标点击事件

你可能感兴趣的:(QT,qt)