【qt】核心机制信号槽(下)

简介: 【qt】核心机制信号槽(下)

自定义的信号

信号就是一个函数声明

前面咱们都用的qt组件自带的信号,接下来我们自己写一个信号。

信号只需要在前面加一个signals即可

这个函数不需要实现

参数传了一个自定义的类型


自定义的槽

当有了自定义的信号,咱们再去搞一个自定义的槽。

注意:在自定义的槽函数,前面加了slots,其实也可以不加,但是不加的话,槽函数将无法使用转换成字符串的方式进行关联,因此建议在自定义槽函数时,最好加上slots.

槽函数是必须要做实现的在mainwindow.cpp中

然后咱们用一个按钮点击信号去关联咱们自定义的槽函数

随便教一下大家如何去用代码创建主键。

首先在mainwindow.h中添加按钮的数据类型

要包含头文件QPushButton

然后在mainwindow.cpp中new一个按键,并进行位置和大小的设置,最后设置按钮文字

然后按钮点击信号和我们的自定义的槽进行关联

运行效果:

这样就做到了自定义槽的使用

自定义的信号和槽的结合使用

上面都是用的组件已经有的信号,下面咱们用自己定义的信号和槽来玩玩。

mainwindow.h中

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QPushButton>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE


struct people
{
    QString name;
    int age;
};

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

signals:
    void mySignal(people p);//自定义的信号传自定义的类型

public slots:
    void mySlot();//自定义的槽
    void mySlot2(people p);//自定义的槽



private:
    Ui::MainWindow *ui;
    QPushButton*btn;
};
#endif // MAINWINDOW_H

mainwindow.cpp中

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPushButton>
#include <QDebug>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    btn=new QPushButton(this);
    btn->setGeometry(200,200,100,50);
    btn->setText("超级大按钮");

    qRegisterMetaType<people>("people");
    //connect(btn,&QPushButton::clicked,this,&MainWindow::mySlot);
    connect(btn,SIGNAL(clicked()),this,SLOT(mySlot()));//必须在声明时,前面加slot

   // connect(this,SIGNAL(mySignal(people p)),this,SLOT(mySlot2(people p)));
     connect(this,&MainWindow::mySignal,this,&MainWindow::mySlot2);

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::mySlot()
{
    qDebug()<<"你点到我了"<<endl;
    people p;
    p.name="姚国林";
    p.age=19;
    emit mySignal(p);//自己写的信号只能手动发送信号
}

void MainWindow::mySlot2(people p)
{
    qDebug()<<p.name<<" "<<p.age<<endl;
    disconnect(this,&MainWindow::mySignal,this,&MainWindow::mySlot2);
}

运行效果:

讲解:

1.connect(this,&MainWindow::mySignal,this,&MainWindow::mySlot2);首先对自定义的信号和槽进行了关联

2.自定义的信号要进行手动发出emit mySignal§;

3.当传的产生类型是自定义的时候,要在关联前加一个qRegisterMetaType(“people”); 其意在Qt中注册一个自定义数据类型people,使其能够在信号和槽之间进行传递。

注意:

信号的参数个数一定要大于等于槽的参数个数

槽的参数类型要与槽的参数类型相对应

信号和槽的断开

当你不想再关联了,或者是防止关联多次,可以使用disconnect进行断开。

当我将disconnect哪行代码进行注释时,我一直点按钮,就会一直输出’你点到我了’和我的信息。

当我添加上这行代码,它只会第一次出现我的信息,后面就关联不上了。

disconnect你要断开那个信号槽,后面就输填入相关的信号槽,跟connect一样。

disconnect的多种形式:

总结:

到这里信号槽也就讲完了。

总的来说信号和槽,都是一个函数

信号是不用做实现的函数

槽是要做具体实现的函数

ui界面的组件都有自己的信号和槽,信号也可以自动发出,我们只需要进行关联即可,手动或者自动关联

如果自定义信号和槽要注意:

  • 定义信号前要加signals
  • 定义槽函数前最好加上slots
  • 参数是自定义的类型,需要加qRegisterMetaType(“class”);
  • 只能手动发出信号 emit

也是成功的将信号槽机制讲完了,你一定可以!愿君更上一层楼!

前行的路总是孤独的,也希望能跟大家成为朋友,一起前进!

快来互粉(^-^)V

相关文章
|
7月前
Qt第二课 核心机制信号槽
Qt第二课 核心机制信号槽
76 1
|
7月前
|
存储 安全 编译器
【Qt 底层机制之信号和槽 】深入探究Qt信号和槽背后的原理
【Qt 底层机制之信号和槽 】深入探究Qt信号和槽背后的原理
2211 4
|
7月前
|
监控 安全 开发者
【Qt 并发 】理解Qt中事件循环与并发机制的协同工作
【Qt 并发 】理解Qt中事件循环与并发机制的协同工作
500 4
|
7月前
|
存储 API C++
【Qt 信号槽】深入探索 Qt 信号和槽机制中的引用传递“ (“A Deep Dive into Reference Passing in Qt Signal and Slot Mechanism“)
【Qt 信号槽】深入探索 Qt 信号和槽机制中的引用传递“ (“A Deep Dive into Reference Passing in Qt Signal and Slot Mechanism“)
660 0
|
7月前
|
数据可视化 图形学 开发者
【Qt 底层机制之图形渲染引擎】深入理解 Qt 的 渲染机制:从基础渲染到高级图形
【Qt 底层机制之图形渲染引擎】深入理解 Qt 的 渲染机制:从基础渲染到高级图形
1071 4
|
6月前
|
安全 C++ Windows
Qt信号与槽机制
Qt信号与槽机制
60 1
|
4月前
QT信号槽
QT信号槽
44 0
|
5月前
|
调度
【浅入浅出】Qt多线程机制解析:提升程序响应性与并发处理能力
在学习QT线程的时候我们首先要知道的是QT的主线程,也叫GUI线程,意如其名,也就是我们程序的最主要的一个线程,主要负责初始化界面并监听事件循环,并根据事件处理做出界面上的反馈。但是当我们只限于在一个主线程上书写逻辑时碰到了需要一直等待的事件该怎么办?它的加载必定会带着主界面的卡顿,这时候我们就要去使用多线程。
180 6
|
7月前
|
图形学 C++ 容器
QT信号与槽机制 和 常用控件介绍
QT信号与槽机制 和 常用控件介绍
QT信号与槽机制 和 常用控件介绍
|
6月前
|
XML JSON 前端开发
Qt委托代理机制之《Model/View/Delegate使用方法》
Qt委托代理机制之《Model/View/Delegate使用方法》
532 1