QT学习之信号和槽

发布时间:2024年01月11日

信号与槽:https://blog.csdn.net/qq_54169998/article/details/125982843
signal & slot,信号可以和槽相连(QObject::connect(&b,SIGNAL(signalChangeColor(int)),this, SLOT(SlotChangeColor(int i)));),信号也可以跟信号相连(一个触发后会触发另一个)QObject::connect(&a,SIGNAL(signalChangeColor(int)), this, SIGNAL(signalChangeColor(int)));;
signal是被发射的事件,如Button鼠标单击是发射的clicked信号;定义信号使用signals关键字;
signals:
void testFun(QString& str); // 不需要实现
solt:对信号响应的函数,槽函数可以与一个信号关联,当信号被发射,关联的槽函数自动被执行;
public/protected/private slots:
void testFun1(QString& str);
void testFun2();

   QCoreApplication::exec()启动事件循环

信号与槽链接方式: https://www.cnblogs.com/bclshuai/p/8665779.html

  连接信号与槽的connect()函数原型如下:
         bool QObject::connect ( const QObject * sender, const QMetaMethod & signal, const QObject * receiver, const QMetaMethod & method, Qt::ConnectionType type = Qt::AutoConnection );
         sender:信号发射者;
         signal:发射的信号,如clicked;
         receiver:信号接受者;槽函数所在类、某个标签、输出框;
         method:槽函数;
         Qt::ConnectionType type:信号和槽的连接响应类型;

当信号与槽没有必要继续保持关联时,我们可以使用 disconnect 函数来断开连接。其定义如下:

bool QObject::disconnect ( const QObject * sender, const char * signal,

const Object * receiver, const char * member )
可以通过参数控制信号发射者和所有信号的关联,也可以控制断开某种信号的关联,或者断开发射者和某接受者的关联;

1.按名字自动关联:槽名字定义为on_按钮名称_信号名称方式,点击按钮触发信号会自动关联到该槽函数;
等同于:DirectConnection,是connect函数默认连接类型;
QT Designer中编辑槽函数名,
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

代码里定义的名字一定和QT desiger里编辑的槽名字一致,这样等按钮触发单击事件就会发送信号到本次新增的槽里;
在这里插入图片描述

   该方式源码在 ui.setupUi(this)里: 如下,

在这里插入图片描述

3.手动新增信号和槽,且建立关联:
QtWidgetsApplication1.h文件
在这里插入图片描述

QtWidgetsApplication1.cpp文件
在这里插入图片描述
ui:
在这里插入图片描述

在这里插入图片描述
点击按钮的那个是按名字自动关联触发槽函数的;
按钮的槽函数发射了一个信号,这个信号触发了另一个槽函数,第二个槽函数弹得那个“可以触发!!”的框;

4.信号槽的连接响应类型:
Qt::AutoConnection :值是0; 自动识别。当信号发送者和接收者处于同一线程内时,这个类型等同于DirectConnection,反之等同于QueuedConnection,这个类型也是connect函数的默认连接类型;
Qt::DirectConnection:值是1;同步执行。信号一旦发射,与之关联的槽函数立即执行,执行返回后才能执行emit(发射)之后的代码,相当于函数调用。
Qt::QueuedConnection:值是2;异步执行。当信号产生,信号会暂时被缓冲到一个消息队列中,不用等待槽函数返回,就会执行后面的代码。等待接收者的事件循环处理去队列中获取消息,然后执行和信号关联的槽函数,这种方式既可以在同一线程内传递消息也可以跨线程操作;
Qt::BlockingQueuedConnection :值是3; 阻塞执行。这种类型类似于QueuedConnection,但是它只能应用于跨线程操作即发送者和接收者处于不同的线程中的情况,并且信号发送者线程会阻塞等待接收者的槽函数执行结束。如果是同一个线程调用,会造成死锁现象;
Qt:: Unique Connection: 值是4;作用相当于Qt::AutoConnection。只是防止重复连接。如果当前信号和槽已经连接过了,就不再连接了。

2.Connect连接信号与槽函数

2.1 无参以下两种方式都可以,&方式无需添加参数,但是槽函数如果是重装则不能使用&方式,因为不添加参数不知道调用的具体槽函数;
SIGNAL、 SLOT需要添加参数;
QObject::connect(pushButton, &QPushButton::clicked, this, &QtWidgetsApplication1::on_pushButton_clicked);
QObject::connect(pushButton, SIGNAL(clicked()), this, SLOT(on_pushButton_clicked ()));

  • 2.2 有参连接
    如果槽函数没有重载函数,则&方式和SIGNAL、 SLOT方式都能用;
    QObject::connect(ui.verticalScrollBarAlarm, &QScrollBar::valueChanged, this, &AlarmCenter::AlarmListVScrool);
    QObject::connect(ui.verticalScrollBarAlarm, SIGNAL(valueChanged(int)), this, SLOT(AlarmListVScrool(int)));
    2.3 自定义结构体参数方式
    struct DealDetailInfo
    {
    };
    Q_DECLARE_METATYPE(DealDetailInfo); —结构体声明结束的地方加上结构体注册。
    信号定义

    signals:
    void signalOnePointUpdateData(QVariant VarDetailInfo);
    槽函数定义
    void SlotOnePointUpdateData(QVariant VarDealInfo);
    信号槽连接
    QObject::connect(&m_DealDetail, SIGNAL(signalOnePointUpdateData(QVariant)), this, SLOT(SlotOnePointUpdateData(QVariant)), Qt::QueuedConnection);

    发送信号的地方用变量QVariant包装结构体参数
    QVariant DataVar;
    DataVar.setValue(DetailInfo);
    emit signalOnePointUpdateData(DataVar);
    接收信号的地方从包装中取出结构体参数
    DealDetailInfo DealInfo;
    DealInfo= VarDealInfo.value();

文章来源:https://blog.csdn.net/qq_23136415/article/details/135506063
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。