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