西安个人建网站,青岛网页设计公司,晋城网站seo,震泽做网站#x1f3e0;个人主页#xff1a;Yui_ #x1f351;操作环境#xff1a;Qt Creator #x1f680;所属专栏#xff1a;Qt 文章目录 1.信号和槽的概念1.1 信号的本质1.2 槽的本质1.3 补充说明2. 信号和槽的使用2.1 connect函数介绍2.2 connect函数的简单使用2.2.1 图形化方… 个人主页Yui_ 操作环境Qt Creator 所属专栏Qt 文章目录 1.信号和槽的概念1.1 信号的本质1.2 槽的本质1.3 补充说明2. 信号和槽的使用2.1 connect函数介绍2.2 connect函数的简单使用2.2.1 图形化方式2.2.2 代码方式 2.3 查看内置信号和槽 3. 知识补充——connect的参数类型问题 在正式介绍
connect函数前还需要好好了解信号和槽的概念 1.信号和槽的概念
所谓信号大家都不陌生生活中的红绿灯就是一种信号当出现红灯时你就接受到了一个红灯信号然后指向停下来的动作。 同时如果你也有学习Linux的经历也会学到信号Signal是系统内部的通知机制。 Linux中的信号会涉及到3个要素
信号源谁发送的信号。信号的类型哪种类型的信号。信号的处理执行自定义的信号处理函数或者使用系统默认的处理函数。 Qt中的信号和Linux中的信息虽然不是一样的概念但其实也有相似之处。 Qt中谈到信号也会涉及到三个要素信号源由哪个控件发出的信号。信号的类型用户进行的不同操作比如’用户点击按钮’、用户关闭窗口’都是一个事件每个事件都会发出一个信号点击按钮触发点击信号在输入框中移动光标触发移动光标的信号。信号的处理方式Qt中的所有控件都具有接受信号的能力一个控件还可以接受多个不同的信号。对于接受到的每个信号控件都会做出响应的动作在Qt中对信号做出的响应动作就称之为槽。 我们写GUI程序就是要让用户进行操作就是要和用户进行交互这个过程中就需要关注用户当前的具体操作是什么样的操作。 信号和槽是Qt中特有的消息传输机制他能将相互独立的控件关联起来比如按钮和窗口本身就是两个独立的控件点击按钮并不会对窗口造成任何影响。通过信号和槽机制可以将按钮和窗口进行关联实现点击按钮会使窗口关闭的效果。 演示 现在你可能看不懂但当学完connect函数就没问题了。
1.1 信号的本质
信号的本质是事件 信号是由于用户对窗口或者控件进行了某种操作导致窗口或者控件产生了某个特定的事件这时Qt对于的窗口类会发送某个信号以此对用户的操作做出反应。 常见的事件有
按钮单点、双击。窗口刷新。键盘输入。 。。。 那么信号Qt中的信号通过什么样的形式呈现够使用者的呢 当某个事件产生了Qt框架会调用某个对应的信号函数通知使用者。 信号的呈现形式就是函数
1.2 槽的本质
槽的本质就是对信号响应的函数是一个回调函数。 槽函数与一般的函数不同槽函数可以与一个信号关联当信号产生时关联的槽函数会自动被执行。
1.3 补充说明
信号和槽机制底层是通过函数间的相互调用实现的每个信号都可以用函数来表示称为信号函数每个槽也可以用函数表示称为槽函数。例如按钮被按下这个信号可以用clicked()函数表示窗口关闭这个槽可以用close()函数表示假如使用信号和槽机制实现点击按钮会关闭窗口的功能其实就是使用clicked()函数调用close()函数的效果。 信号函数和槽函数通常位于某个类中和普通的成员函数相比它们的特别在于
信号函数使用signals关键词修饰槽函数用private slots/protected slots/public slots修饰。signals/slots是Qt中在C的基础上扩展的关键字专门指明信号函数和槽函数。信号函数只需要声明不需要定义实现而槽函数需要定义实现。 信号函数的定义自动在编译之前生成编写Qt应用程序的程序员无需关注。 这种自动生成代码的机制称为元编程在很多场景中都能见到。 2. 信号和槽的使用
在Qt中QObject类提供了一个静态成员函数connect()函数改函数专门用来关联指定的信号函数和槽函数。
2.1 connect函数介绍
connect(const QObject* sender,const char* singal,const QObject* receiver,const char* method,Qt::ConnectionType type Qt::AutoConnection)参数说明
sender信号的发送者。signal发送的信号(信号函数)。receiver信号的接受者。method接受信号的槽函数。type用于指定关联的方式默认的关联方式为Qt::AutoConnection通常不需要手动设置。
2.2 connect函数的简单使用
connect函数的简单使用我们要实现的功能就是点击按钮使得按钮上的Hello World变成Hello Yui.
2.2.1 图形化方式 开始编辑处理代码 widget.cpp
#include widget.h
#include ui_widget.hWidget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui-setupUi(this);connect(ui-pushButton,QPushButton::clicked,this,Widget::handle);
}Widget::~Widget()
{delete ui;
}void Widget::handle()
{ui-pushButton-setText(Hello Yui);
}2.2.2 代码方式
#include widget.h
#include ui_widget.hWidget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui-setupUi(this);button new QPushButton(this);button-setText(Hello World);button-move(200,200);connect(button,QPushButton::clicked,this,Widget::handle);
}Widget::~Widget()
{delete ui;
}void Widget::handle()
{button-setText(Hello Yui);
} 2.3 查看内置信号和槽
系统自带的信号和槽通常通过Qt的帮助文档来查询。 就比如我们要查看按钮的信号在帮助文档中输入QPushButton 然后再去文档中寻找signals 如果没有找到继续去父类中查找。比如QPushButton的父类QAbstractButton 3. 知识补充——connect的参数类型问题
connect(const QObject* sender,const char* singal,const QObject* receiver,const char* method,Qt::ConnectionType type Qt::AutoConnection)可以看到的是singal和method的类型都是char* 但是我们传递的却是函数指针就比如method的函数指针类型是void(*)()这可对不上C可不允许你使用两个不同的指针类型相互赋值。那么这是怎么一回事呢 以这个代码为例
#include widget.h
#include ui_widget.hWidget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui-setupUi(this);button new QPushButton(this);button-setText(Hello World);button-move(200,200);connect(button,QPushButton::clicked,this,Widget::handle);
}Widget::~Widget()
{delete ui;
}void Widget::handle()
{button-setText(Hello Yui);
}现在的写法为
connect(button,QPushButton::clicked,this,Widget::handle);但是在Qt5以前的写法为
connect(button,SIGNAL(QPushButton::clicked),this,SLOT(Widget::handle));Qt5开始对上述的写法做出了简化不需要写SIGNAL和SLOT宏了给connect提供了重载版本在重载版本中第二个参数和第四个参数成了泛型参数允许我们传入任意类型的函数指针了。 按住ctrl加鼠标左键跳转 此时的connect函数就带有一定的参数检查功能 如果你传入的第一个参数和第二个参数不匹配或者第三个参数和第四个参数不匹配代码会编译出错这里用到了类型萃取。 往期文章 【Qt】初始项目代码解释-CSDN博客 【Qt】HelloWorld程序-CSDN博客