2016-10-08 3 views
-1

私はloginmanagerクラスからmainwindowにカスタムシグナルlogin()を送出しようとしました。シグナルはloginButtonClickedスロットで発生し、シグナル/スロットメカニズムについて理解しているならば、シグナルが発生したイベントをキャプチャし、対応するスロットが実行されるように見えるはずです。しかし、それは私が思ったようには機能しません。Qtクラスからクラスへシグナルを送信します

connect関数は1を返します。つまり、mocファイルに実装できることを意味し、login()シグナルを発生させるm_LoginManager-> setLogin()を実行すると動作します。

しかし、私が好むのは、loginButtonによってシグナルが発信され、メインウィンドウにプロセス(この場合はinit())として渡されるということです。

私が間違っている場合は私を修正してください。

以下はコードです。

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

これは役に立ちます:http://stackoverflow.com/q/26422154/1421332 – Silicomancer

+0

私はこれを読んだ。すべてをチェック(私は信じている)、問題は依然として残っています。私は直面している問題とまったく同じ問題について何人かの人に聞いたことがありますが、適切な解決策を得られませんでした。だから私はもう一度尋ねることにしました。他の人たちも助けてくれることを願っています。 – ReverseEngineer

+0

コード内のconnect()戻り値を確認する必要があります。また、loginButtonClicked()定義にはクラス名がありません。 – Silicomancer

答えて

0

SafeboxManagerとLoginManagerオブジェクトは十分な長さで存続する必要があります。生活時間をチェックしてください。

+0

また、この種の間違いを信号/スロットのトラブルシューティングの回答に追加しました:http://stackoverflow.com/a/26422155/1421332 – Silicomancer

関連する問題