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

本文介绍如何通过继承QComboBox类并添加自定义信号clicked()来实现控件的点击事件。通过新建MycomboBox类,覆盖鼠标点击事件并在QTCreator的设计界面进行控件提升,最终实现控件点击信号与槽的绑定。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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、再次右击控件,选择“转到槽”弹窗里就出现所添加的信号选项了,选中后会自动连接到生成的槽函数,就可以愉快的编写想要的效果了。
在这里插入图片描述

参考博客

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

Qt框架中,自定义控件通常需要继承自QObject,因为QObject是所有Qt对象的基,它提供了信号、属性系统、事件处理等核心功能。如果自定义控件需要具备按钮的功能,通常还会选择继承自QWidget或其子。QPushButton是Qt中预定义的按钮控件,它也是继承自QWidget,因此自定义控件可以通过多重继承的方式同时继承自QObjectQPushButton。 创建一个同时继承自QObjectQPushButton的自定义控件的大致步骤如下: 1. 定义:在定义中,让新的同时继承自QObjectQPushButton。 ```cpp class MyCustomButton : public QObject, public QPushButton { Q_OBJECT public: MyCustomButton(QWidget *parent = nullptr); // 其他成员函数声明 }; ``` 2. 实现构造函数:在构造函数中初始化QPushButton,如果有必要,也可以重写其他虚函数或添加新的功能。 ```cpp MyCustomButton::MyCustomButton(QWidget *parent) : QPushButton(parent) { // 初始化代码,例如设置按钮文本、大小等 // 可以在这里调用基的构造函数或者其他初始化方法 } ``` 3. 添加自定义行为:在添加自定义的方法属性,使得自定义控件满足特定的需求。 请注意,在使用多重继承时应当谨慎,确保不会引起菱形继承问题(即钻石问题),这可能导致基被多次构造析构,从而引起内存管理上的问题。在Qt中,通常推荐使用单一继承,并通过组合(Composition)的方式来设计
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值