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

【Qt】7.信号和槽_connect函数用法(2)

文章目录

  • 3. 信号和槽的使用
    • 3.2 查看内置信号和槽
    • 3.3 通过 Qt Creator 生成信号槽代码
    • 3.4 第二种创建槽函数的方式


3. 信号和槽的使用

3.2 查看内置信号和槽

两个问题:

咋知道的QPushButton有个clicked信号?

咋知道的QWidget有一个close槽?

Qt里到底都提供了哪些内置的信号和槽可以让我们直接使用呢?

大家在翻阅文档的时候,如果在当前类中没有找到对应的线索,不妨看看这个类的父类。

系统自带的信号和槽通常是通过 “Qt 帮助文档” 来查询。

如上述示例,要查询 “按钮” 的信号,在帮助文档中输入:QPushButton

  • 首先可以在 “Contents” 中寻找关键字 signals
  • 如果没有找到, 继续去父类中查找. 因此我们去他的父类 QAbstractButton 中继续查找关键字 signals

592214264fc61ebbe3bf06a9b1e53eb2

5ce10b510d0ad0a9a698d7bf92f6eb77

9e3216c317ef4f038fdc0c2e6eaf9ec3

这里的 clicked() 就是要找的信号。这里的参数checked暂时用不到,后面遇到了再说。

槽函数的寻找方式和信号一样,只不过它的关键字是 slot


connect的具体用法:

bool connect(const QObject *sender, const char *signal_, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection);

我们可以看到第2,4个参数类型都是char*

connect(button,&QPushButton::clicked,this,&Widget::close);

但是这里的第2,4个参数类型是void(*)(),是函数指针,但是函数指针有很多种。

C++中,不允许你使用两个不同的指针类型,相互赋值,(函数传参,本质上就是赋值)

void(*)()
bool(*)()
即使是这两个函数指针的类型都是不一致的!

b808dc61b66ac0c1f6f6fe381308e7bd

这个函数声明,是以前l日版本的Qt的connect函数的声明,以前版本中,传参的写法和现在其实也是有区别的。

此时,给信号参数传参,要搭配一个SIGNAL宏。

给槽参数传参,搭配一个SLOT宏。

SIGNAL宏和SLOT宏会将传入的函数指针转成char*

connect(button,SIGNAL(&QPushButton::clicked),this,SLOT(&Widget::close);

Qt5开始,对上述写法做出了简化。不再需要写SIGNAL和SLOT宏了。

connect提供了重载版本,重载版本中,第二个参数和第四个参数成了泛型参数,允许咱们传入任意类型的函数指针了。

也就是CPP泛型编程

0161d782a31a2389a5e4926a5c3aad6e

此时connect函数就带有了一定的参数检查功能。

如果你传入的第一个参数和第二个参数不匹配,或者第三个参数和第四个参数不匹配(不匹配指的是:2,4参数的函数指针,不是1,3参数的成员函数)

此时代码编译出错。


3.3 通过 Qt Creator 生成信号槽代码

Widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();void handleClicked();private:Ui::Widget *ui;
};
#endif // WIDGET_H

Widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QPushButton>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QPushButton* button = new QPushButton(this);button->setText("按钮");button->move(100,100);connect(button,&QPushButton::clicked,this,&Widget::handleClicked);
}Widget::~Widget()
{delete ui;
}void Widget::handleClicked()
{//按下按钮,修改窗口标题this->setWindowTitle("按钮已经按下");
}

运行:

00f6878d2622106c4742d03bbeb03537

点击

7bb4127f6c7854f99115a99d6841af04


3.4 第二种创建槽函数的方式

先新建项目,点击.ui控件

Push Button按钮拖到页面

f563dee09a65e50528c8dd6b4c907edb

右键按钮,点击转到槽

0253ffe525f80402bdd0f67dce76e290

28fbb85a0d84705c155520b648698d8e

这个窗口就列出了QPushButton给我们提供的所有的信号(还包含了QPushButton父类的信号)

对于普通按钮来说, 使用 clicked 信号即可。 clicked(bool) 没有意义的,具有特殊状态的按钮(比如复选按钮)才会用到 clicked(bool)

双击clicked,就会自动生成一个函数并跳转,并且声明也有

385d5b11473cfa8fa9985c603ff6a67e

运行,点击

741499c4565f20f72f7ca177840d7db2

可以发现这里没有connect,并且在对应的ui_widget文件里面也没有。

Qt中,除了通过connect来连接信号槽之外,还可以通过函数名字的方式来自动连接。

7275f4991691cd3ee3817f0b736b20e8

说明:

自动生成槽函数的名称有一定的规则。槽函数的命名规则为:on_XXX_SSS,其中:

  1. 以 " on " 开头,中间使用下划线连接起来;

  2. " XXX " 表示的是对象名(控件的 objectName 属性)。

  3. " SSS " 表示的是对应的信号。

如:" on_pushButton_clicked() " ,pushButton 代表的是对象名,clicked 是对应的信号。

按照这种命名风格定义的槽函数,就会被 Qt 自动的和对应的信号进行连接。

但是咱们日常写代码的时候,除非是 IDE 自动生成,否则最好还是不要依赖命名规则,而是显式使用 connect 更好。

一方面显式 connect 可以更清晰直观的描述信号和槽的连接关系,另一方面也防止信号或者槽的名字拼写错误导致连接失效。

当函数名符合上述规则之后,Qt就能自动的把信号和槽给建立上联系。

如果我们把on_pushButton_clicked改成on_pushButton_click,那么运行后点击按钮无反应,没有连接槽,并且出现下面提示,因为后者不存在Qt中。

73c5248d973295a2f1f875a778040beb

Qt中调用这个函数的时候,就会触发上述自动连接信号槽的规则

正是在自动生成的ui_widget.h中调用的。

f735f01bb0b66820dd094828f82206a3

如果我们通过图形化界面创建控件,还是推荐使用这种快速的方式来连接信号槽

如果我们是通过代码的方式来创建控件,还是得手动connect。(代码中没有调用connectSlotsByName

http://www.dtcms.com/a/490944.html

相关文章:

  • 网站的建设流程具体有哪些哪个合肥seo好
  • 大连公司网站建设站点与网站有什么区别
  • 高压混动救援的 “及时雨”:XRC-3363 系列救援充电器实操解析与安全要点
  • 玛哈特激光落料线:一条会“思考”的钢铁流水线
  • 《爬虫进阶之路:从模拟浏览器到破解动态加载的实战指南》
  • 现在做个人网站上海发布最新情况
  • 网站漂浮图片代码怎样把自己的网站上传
  • 如何做微网站社交电商怎么做
  • 离线安装NetData:高效监控服务器指南
  • 学习笔记-eventpp库
  • uni-app Vue 项目的规范目录结构全解
  • 在线预约导游|基于SSM+vue的在线预约导游系统(源码+数据库+文档)
  • 网站你懂我意思正能量免费网站推广策划的流程
  • 信宜网站建设公司厦门 网站建设
  • 免费建立网站的平台wordpress简体中文版下载
  • 在小车上挂载nfs
  • C# 开发最新趋势:在性能与智能的浪潮中乘风破浪
  • EL817S1(C)(TU)-F 晶体管输出光耦合器 EVERLIGHT亿光 高隔离电压 电子解析
  • 河北建设厅录入业绩的网站营销方案100例
  • 品牌营销专家:为企业发展注入强劲动力
  • MS2107高性能USB 2.0视频信号和音频采集,支持NTSC/PAL制式,适用于低成本视频采集设备
  • 利用R绘制条形图
  • 解决Redis数据丢失难题:深入理解RDB与AOF持久化机制
  • 自己买一台服务器做自己的网站浙江省城乡建设厅官方网站
  • ARM处理器指令集
  • Day64 设备树与GPIO子系统驱动开发实践
  • 贝莱德终止收购云交所,YUNC暴跌风波
  • 源码网站php重庆观音桥网站建设
  • SWE-QA:语言模型能否回答仓库级代码问题?
  • 建功能网站有没有专业做效果图的网站