当前位置: 首页 > article >正文

QT::QComboBox自定义左击事件信号

因为QComboBox没有自定义的clink信号,所以自己新建一个MyComBox类继承QComboBox,并且添加自定义的左击信号,以及使用该信号连接一个槽函数

mycombobox.h

#ifndef MYCOMBOBOX_H
#define MYCOMBOBOX_H

#include <QComboBox>
#include <QMouseEvent>
class MyComboBox : public 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

mycombobox.cpp

#include "mycombobox.h"

MyComboBox::MyComboBox(QWidget *parent):QComboBox(parent)
{
}
MyComboBox::~MyComboBox()
{
}
void MyComboBox::mousePressEvent(QMouseEvent *event)
{
    if(event->button() == Qt::LeftButton)
    {
        emit clicked();  //触发clicked信号
    }
    QComboBox::mousePressEvent(event);  //将该事件传给父类处理,这句话很重要,如果没有,父类无法处理本来的点击事件
}

mainwindows.cpp

    connect(ui->mycomboBox1, SIGNAL(clicked()), this,SLOT(mycomboBox_slot()));

在ui界面添加一个原来的控件QComboBox,然后把这个控件提升为MyComboBox就可以使用了。具体步骤为:打开ui界面----->>选中QComboBox控件,右击----->>选择“提升为”----->>在“提升的类名称里面”填入新建的类“MyComboBox”名称----->>点击“添加”按钮----->>再点击“提升”按钮
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
点击上图中的clicked()自动在mainwindows.cpp中生成
在这里插入图片描述
自动生成的槽函数名是on_控件名字_信号名字() 重点!!!

你会发现使用ui界面自动生成的槽函数和信号,没有connect操作,那他们是怎么连接到一块的呢?

这里没有发现用 connect() 函数进行mycomboBox1的信号与槽函数关联的操作。这些功能是如何实现的呢?
查看编译生成的 ui_mainwindow.h 文件。构造函数里调用的 setupUi() 是在 ui_mainwindow.h 文件里实现的。查看 setupUi() 函数的内容,也没有发现用 connect() 函数进行mycomboBox1的信号与槽关联的操作,只是在 setupUI()里发现了如下的一条语句:
QMetaObject::connectSlotsByName(MainWindow);
秘密就在于这条语句。connectSlotsByName(QMainWindow) 函数将搜索 QMainWindow界面上的所有组件,将信号与槽函数匹配的信号和槽关联起来,它假设槽函数的名称是:
void on__();
例如,通过 UI 设计器的操作,为 mycombobox1 自动生成的槽函数是:
void on_mycomboBox1_clicked();
它就正好是 mycomboBox1的信号 clicked() 的槽函数。那么,connectSlotsByName() 就会将此信号和槽函数关联起来,如同执行了下面的这样一条语句:
connect(mycomboBox1, SIGNAL(clicked ()),
this, SLOT (on_mycomboBox1_clicked());
这就是用 UI 设计器可视化设计某个组件的信号响应槽函数,而不用手工去将其关联起来的原因,都是在界面类的构造函数里调用 setupUi() 自动完成了关联。


http://www.kler.cn/a/304900.html

相关文章:

  • 【Linux】进程池实现指南:掌控并发编程的核心
  • 什么是两化融合
  • windows 11编译安装ffmpeg(包含ffplay)
  • C 语言标准库 - <errno.h>
  • [vulnhub] DarkHole: 1
  • 《重学Java设计模式》之 原型模式
  • 使用豆包MarsCode编程助手提升开发效率的实战分享!
  • 算法-最少箭引爆气球(贪心+区间)
  • oracle停止当前运行的JOB或kill会话
  • Python图像处理——计算机视觉中常用的图像预处理
  • Conda新建虚拟环境,安装包一直失败:000和404错误
  • RabbitMQ 基础入门
  • 【python爬虫】之scrapy框架介绍
  • yolo自动化项目实例解析(一)日志格式输出、并发异步多线程、websocket、循环截图、yolo推理、3d寻路
  • 一天认识一个硬件之光纤
  • flink中chainWith() 的详解
  • 【Prompt Engineering:自我一致性、生成知识提示、链式提示】
  • Qt之OpenCv 灰度处理、均值滤波、边缘检测学习
  • 端口大全说明,HTTP,TCP,UDP常见端口对照表
  • Go语言现代web开发07 map字典
  • Eclipse 悬浮提示:提高编程效率的利器
  • Android NDK工具
  • BFS迷宫最小路径问题
  • 【人工智能】OpenAI发布GPT-o1模型:推理能力的革命性突破,这将再次刷新编程领域的格局!
  • 二叉树(上)
  • 定时中断键盘灯闪烁