Qt 从 class 发出信号到 class

Qt emit signal from a class to class

我试图从我的登录管理器 class 向主窗口发出自定义信号 login()。信号在 loginButtonClicked 插槽上触发,据我对 signal/slot 机制的理解,它应该能够捕获任何信号触发事件和 "look" 以执行相应的插槽。但它并不像我想的那样。

连接函数 returns 1,这意味着它可以在 moc 文件中实现,如果我 运行 m_LoginManager->setLogin() 它确实有效触发 login() 信号。

但我更喜欢信号由 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);
}

SafeboxManager 和 LoginManager 对象必须足够长。检查寿命。