2016-10-08 1 views
-1

J'ai essayé d'émettre un signal personnalisé login() de ma classe loginmanager vers la mainwindow. Le signal est déclenché sur le slot loginButtonClicked, et à ma connaissance sur le mécanisme signal/slot, il devrait être capable de capturer n'importe quel événement déclenché par le signal et "chercher" l'emplacement correspondant à exécuter. Mais ça ne marche pas comme ce que je pense.Qt émet un signal d'une classe à la classe

La fonction connect renvoie 1, ce qui signifie qu'elle peut être implémentée dans le fichier moc, et cela fonctionne si je lance m_LoginManager-> setLogin() qui déclenche le signal login().

Mais ce que je préfère est le signal est émis par le loginButton, et passe à la mainwindow pour être le processus (dans ce cas, init()).

Corrigez-moi si je me trompe.

Voici le code.

loginmanager.cpp

LoginManager::LoginManager(QWidget * parent) : QWidget(parent) 
{ 
    ui.setupUi(this); 

    connect(ui.loginButton, SIGNAL(clicked()), this, SLOT(loginButtonClicked()); 
} 

LoginManager::~LoginManager() 
{ 

} 

void LoginManager::setLogin() 
{ 
    emit login(); 
} 

void LoginManager::loginButtonClicked() 
{ 
    setLogin(); 
} 

loginmanager.hpp

#include <QWidget> 
#include "ui_loginmanager.h" 

class DatabaseManager; 
class SettingManager; 

class LoginManager : public QWidget 
{ 
    Q_OBJECT 

public: 
    LoginManager(QWidget * parent = Q_NULLPTR); 
    ~LoginManager(); 

    void setLogin(); 

signals: 
    void login(); 

public slots: 
    void loginButtonClicked(); 

private: 
    Ui::LoginManager ui; 
}; 

mainwindow.hpp

#include <QtWidgets/QMainWindow> 
#include "ui_safeboxmanager.h" 

class SafeboxManager : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    SafeboxManager(QWidget *parent = 0); 
    ~SafeboxManager(); 

public slots: 
    void init(); 

private: 
    Ui::SafeboxManagerClass ui; 
    LoginManager*  m_LoginManager; 
}; 

#endif // SAFEBOXMANAGER_H 

mainwindow.cpp

#include "safeboxmanager.hpp" 
#include "loginmanager.hpp" 

SafeboxManager::SafeboxManager(QWidget *parent) 
    : QMainWindow(parent) 
{ 
    ui.setupUi(this); 

    m_LoginManager = new LoginManager(); 

    ui.mainToolBar->setEnabled(false); 
    ui.tableWidget->setEnabled(false); 

    connect(m_LoginManager, SIGNAL(login()), this, SLOT(init())); 

    //m_LoginManager->setLogin() << this work 
} 

SafeboxManager::~SafeboxManager() 
{ 

} 

void SafeboxManager::init() 
{ 
    ui.mainToolBar->setEnabled(true); 
    ui.tableWidget->setEnabled(true); 
} 
+0

Cela pourrait aider: http://stackoverflow.com/q/26422154/1421332 – Silicomancer

+0

J'ai lu cela. Vérifié tout (je crois) et le problème persiste toujours. J'ai lu quelques personnes poser des questions sur exactement le même problème que je suis confronté, mais n'a pas obtenu une bonne solution. C'est pourquoi j'ai décidé de demander à nouveau, je l'espère, d'aider les autres aussi. – ReverseEngineer

+0

Vous devriez vérifier les valeurs de retour connect() dans votre code. La définition de loginButtonClicked() est également dépourvue de nom de classe. – Silicomancer

Répondre

0

Les objets SafeboxManager et LoginManager doivent durer suffisamment longtemps. Vérifiez les durées de vie.

+0

J'ai également ajouté ce genre d'erreur à la réponse de prise de problème de signal/emplacement ici: http://stackoverflow.com/a/26422155/1421332 – Silicomancer