1. 程式人生 > >Qt訊號和槽的連線--發射訊號而槽未響應

Qt訊號和槽的連線--發射訊號而槽未響應

connect函式應該在哪裡連線訊號和槽呢?應該怎麼用呢?為什麼會出現槽不響應訊號的問題呢?
這個問題在剛接觸Qt的時候可能會碰到,前兩天我在開發軟體的過程中就遇到了這個問題,我發射一個自定義的訊號,但是與其連線的槽函式卻沒有被執行。在試過網上很多方法之後,未果,但是我看見了一個十分貼近的答案,是論壇中的這個問答http://bbs.csdn.net/topics/390536956。於是我腦中閃過一個想法,可能就是最用域在作怪。然後我試著又修改了一兩次, 又未果,但我堅信是這個問題,應該是哪裡沒理解到位,於是決定寫一個簡單點的程式測試一把,最終成功了。
這次的經歷體現出了基礎的重要性以及我這個半路出家的程式設計師基礎還很差!–謹以此文來記錄問題和鞭策自己。測試程式入下:
整體結構如圖:
這裡寫圖片描述

測試程式碼:

#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函式連線成功後執行,否則仍然會發生相同的問題。