2015-02-09 49 views
-1

我想將按鈕連接到client::prework()。經過簡單的調試後,我發現client::prework()沒有被調用(沒有任何部分正在執行),但QObject::connect調用返回true儘管連接成功,插槽仍未調用

client.h

class client : public QObject 
{ 
    //some declarations 
    public slots: 
    int prework(); 
}; 

client.cpp

void client::prework() 
{ 
    //implementation 

} 

mainwindow.cpp

MainWindow::MainWindow(QWidget *parent) : 
QMainWindow(parent), 
ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
    QWidget * wdg = new QWidget(this); 
    QVBoxLayout *vlay = new QVBoxLayout(wdg); 
    QPushButton *btn1 = new QPushButton("connectme"); 
    vlay->addWidget(btn1); 
    client obj1; 
    qDebug()<<"h"; 
    QObject::connect(btn1,SIGNAL(clicked()),&obj1,SLOT(prework())); 
// obj1.prework(); 
} 
+4

您忘記了將'Q_OBJECT'宏添加到'client'聲明中。請參閱:http://stackoverflow.com/questions/1368584/qt-question-what-does-the-q-object-macro-do-why-do-all-qt-objects-need-this-ma – Nejat 2015-02-09 06:42:29

+0

您聲明'prework'在標題中返回'int',但是在你的.cpp中,你將它定義爲'void'。這是一個錯字,對嗎? – thuga 2015-02-09 08:01:49

回答

0
MainWindow::MainWindow(QWidget *parent) : ... 
{ 
    ... 
    client obj1; 
    ... 
} // 1 

標有// 1該生產線是其中obj1得到d線estroyed。局部變量不會超過它們創建的範圍。 (並且QObject destructor確保信號斷開連接。)

如果您希望它超過構造函數,則需要使該對象成爲主窗口類的成員。

+0

我將對象設爲全局對象,但它有效,但有沒有辦法使對象成爲全局對象? – user3819404 2015-02-09 06:53:42

+0

你是什麼意思全球?我表示要讓它成爲你班級的成員,按照通常的定義,這不是「全球化」。如果你不希望它作爲你的類的成員(直接或作爲指針),你需要將它存儲在其他地方,並且要非常小心,它會在你的類的實例使用的地方超過它。 – Mat 2015-02-09 06:55:14

+0

你的意思是'obj1'應該成爲'client'類的成員? – user3819404 2015-02-09 07:40:13