QT:信号和槽

发布于:2025-02-10 ⋅ 阅读:(29) ⋅ 点赞:(0)

目录

1.概念

2.信号和槽的使用

2.1代码的方式使用

2.1.1.使用connect关联

2.2图形化界面的方式使用

2.2.1使用流程

2.2.2使用名字关联槽函数

3.自定义信号和槽函数

3.1自定义槽函数

3.2自定义信号

4.总结


1.概念

信号和槽是QT特有的一种机制,信号和槽都是对用户操作的相应。

信号:信号是对用户操作的响应,例:当用户按下按钮时,就会发出信号。

槽:槽或者称作槽函数,是对信号的响应,当信号被发出,与信号关联的槽函数就会相应。

2.信号和槽的使用

2.1代码的方式使用

2.1.1.使用connect关联

template <typename Func1, typename Func2>
    static inline QMetaObject::Connection connect(const typename QtPrivate::FunctionPointer<Func1>::Object *sender, Func1 signal,
                                     const typename QtPrivate::FunctionPointer<Func2>::Object *receiver, Func2 slot,
                                     Qt::ConnectionType type = Qt::AutoConnection)

sender:哪个对象发出的信号

signal:发出的信号类型

recevier:哪个对象处理这个信号

slot:处理信号的槽函数

#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(300,300);
    connect(button,&QPushButton::clicked,this,&Widget::close);
    //
}

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

当点击这个按钮的时候,widget这个窗口就会关闭。

2.2图形化界面的方式使用

2.2.1使用流程

1.点击widget.ui自动跳转到设计页面

2.拖拽push Button这个控件

3.右键转到槽

4.选择clicked

他会自动生成并跳转到与这个关联的槽函数

5.编辑槽函数

2.2.2使用名字关联槽函数

使用图形化界面的方式生成的函数,是直接通过函数名字与控件相连的。

1.必须使用这个函数,才能直接用函数名实现connect

[static] void QMetaObject::connectSlotsByName(QObject *object)

函数会递归的搜索,object参数所有的子对象,然后将格式匹配的信号和槽连接起来。、

2.函数名必须遵循这种格式。

void on_<object name>_<signal name>(<signal parameters>);

 这样就绑定一起了。

 QPushButton *button = new QPushButton(this);
    button->setObjectName("button");
    button->move(300,300);
    button->setText("按钮");

    QMetaObject::connectSlotsByName(this);

void Widget::on_button_clicked()
{
    this->close();
}

3.自定义信号和槽函数

3.1自定义槽函数

1.在头文件 widget类声明槽函数

private slots: //slots是qt特有的关键字
    void mySlot();

2.在 widget.cpp中定义槽函数

void Widget::mySlot()
{
    this->setWindowTitle("标题1");
}

3.与信号绑定后运行

  QPushButton *button = new QPushButton(this);
    button->setText("按钮");
    button->move(300,300);
    connect(button, &QPushButton::clicked, this, &Widget::mySlot);

按下按钮后窗口的标题就会变为标题1

3.2自定义信号

自定义信号,不需要有函数体直接声明即可。

自定义的信号,只能使用emit关键字手动发射信号,其实emit加不加都可以,只是为了可读性罢了。

1.声明一个信号

signals:
    void mySignal();

 2.信号的实现

qDebug会类似cout,qDebug做了一些关于字符集的处理,在打印的时候不会出现乱码。

void Widget::mySlot()
{
    qDebug() << "自定义信号";
}

3.与槽函数绑定并发射

connect(this, &Widget::mySignal, this, &Widget::mySlot);
    emit Widget::mySignal();

4.自定义带参数的槽函数和信号

信号和槽函数的参数类型必须严格匹配的。

信号的参数可以多于槽函数的参数。

4.总结

信号和槽的机制是QT的特色

优点:1.解耦合,信号和槽函数是解耦合的不互相影响。

           2.有多对多的机制(但是没啥用)

缺点:复杂


网站公告

今日签到

点亮在社区的每一天
去签到