Qt信号和槽的连接--发射信号而槽未响应

时间:2021-07-25 22:46:22

connect函数应该在哪里连接信号和槽呢?应该怎么用呢?为什么会出现槽不响应信号的问题呢?
这个问题在刚接触Qt的时候可能会碰到,前两天我在开发软件的过程中就遇到了这个问题,我发射一个自定义的信号,但是与其连接的槽函数却没有被执行。在试过网上很多方法之后,未果,但是我看见了一个十分贴近的答案,是论坛中的这个问答http://bbs.csdn.net/topics/390536956。于是我脑中闪过一个想法,可能就是最用域在作怪。然后我试着又修改了一两次, 又未果,但我坚信是这个问题,应该是哪里没理解到位,于是决定写一个简单点的程序测试一把,最终成功了。
这次的经历体现出了基础的重要性以及我这个半路出家的程序员基础还很差!–谨以此文来记录问题和鞭策自己。测试程序入下:
整体结构如图:
Qt信号和槽的连接--发射信号而槽未响应

测试代码:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "emit.h"
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //connect(T_emit,SIGNAL(emit_test()),T_slot,SLOT(slot_test()));//这里connect不行
}
void MainWindow::init()
{
    T_emit = new Emit;
    T_slot = new Slot;
    connect(T_emit,SIGNAL(emit_test()),T_slot,SLOT(slot_test()));//发射自定义信号要注意作用域
    T_emit->test_fun();
}
MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::on_pushButton_clicked()
{
    /****注释内容是之前的测试,在这里使用connect不能执行槽,因为这里的对象在单击后就“死掉了”。 *****在上面的MainWindow函数(构造函数)中我也试过,代码相同,connect失败!原因相同****/
    //T_emit = new Emit;
    //T_slot = new Slot;
    //T_emit->test_fun();
    //connect(T_emit,SIGNAL(emit_test()),T_slot,SLOT(slot_test()));//这里也不行
    init();
}

经过此番,我的问题终于解决了。总结一下:
在使用connect连接一个信号和一个槽的时候,要注意sender和receiver的作用域,这两个对象如果有一个的提前“死掉了”的话,connect就不会成功。

补充一点偶尔会被遗忘的细节:发射信号时,不仅要保证对象仍在其作用域内,还要注意emit函数要在connect函数连接成功后执行,否则仍然会发生相同的问题。