2016-03-17 14 views
0

我對Qt很新,我一直在玩它。最近在做我的一個項目的時候,我碰到了一些我不明白的東西。出於某種原因,在類JoinWindow中,我無法將受保護的插槽連接到任何設備,但仍可以與其他插槽進行連接。Qt無法連接類的插槽,當連接到繼承類的受保護成員

這裏是我的頭:

#ifndef JOINWINDOW_H 
#define JOINWINDOW_H 

#include "mywindow.h" 

class JoinWindow : public MyWindow 
{ 
public: 
    JoinWindow(QString name = "Guess"); 

protected slots: 
    void on_buttonConnexion_clicked(); 

}; 

#endif // JOINWINDOW_H 

我CPP:

#include "joinwindow.h" 

JoinWindow::JoinWindow(QString name) 
:MyWindow(name) 
{ 
    buttonConnexion->setText("Connexion"); // protected member of MyWindow 

    connect(buttonServer, SIGNAL(clicked()), this, SLOT(on_buttonConnexion_clicked())); 
} 

void JoinWindow::on_buttonConnexion_clicked() 
{ 
    // Code in slot won't get called when the button is clicked 
} 

這裏是爲mywindow的頭文件:

#ifndef MYWINDOW_H 
#define MYWINDOW_H 

#include <QtWidgets> 

class MyWindow : public QWidget 
{ 
Q_OBJECT 

public: 
    MyWindow(QString name = "Guess"); 
    ~MyWindow(); 

    // Some fonctions here and Slots 

protected: 
    QPushButton *buttonServer; 

    // More objects 
}; 

#endif // MYWINDOW_H 

有什麼奇怪的,我不明白,是我沒有收到任何編譯錯誤,我的程序完美無缺。當按下按鈕時,它不會調用插槽on_buttonConnexion_clicked()。更奇怪的是,我連接了一個不屬於JoinWindow類的SLOT,它會調用SLOT,並按下按鈕即可按預期工作。

#include "joinwindow.h" 

JoinWindow::JoinWindow(QString name) 
:MyWindow(name) 
{ 
    buttonConnexion->setText("Connexion"); // protected member of MyWindow 

    connect(buttonServer, SIGNAL(clicked()), qApp, SLOT(quit())); 
} 

void JoinWindow::on_buttonConnexion_clicked() 
{ 

} 

此代碼將在點擊按鈕時關閉應用程序。我還可以連接到類MyWindow的SLOTS,因爲某些原因,它無法連接到JoinWindow的SLOTS。

+0

必須有我不明白的東西,如果我在MyWindow中添加SLOT的定義,它一切正常,你不能在子類中調用新插槽嗎? – Mathieu

回答

0

您需要在創建新插槽後運行qmake。你跑了嗎?

此外,您需要在JoinWindow中添加Q_OBJECT,因爲它是從Q_OBJECT繼承的。像這樣:

#ifndef JOINWINDOW_H 
#define JOINWINDOW_H 

#include "mywindow.h" 

class JoinWindow : public MyWindow 
{ 
    Q_OBJECT 
public: 
    JoinWindow(QString name = "Guess"); 

protected slots: 
    void on_buttonConnexion_clicked(); 

}; 

#endif // JOINWINDOW_H 

添加Q_OBJECT宏並運行qmake。我相信應該修復它。