Qt从一个类发出信号到类

时间:2016-10-08 16:34:55

标签: c++ qt qt-signals slots

我尝试从loginmanager类向主窗口发出自定义信号login()。该信号在loginButtonClicked插槽上触发,据我所知,在信号/插槽机制上,它应该能够捕获任何信号触发事件并“查找”相应的插槽才能执行。但它并不像我想的那样有效。

connect函数返回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);
}

1 个答案:

答案 0 :(得分:0)

SafeboxManager和LoginManager对象必须足够长。检查生命时间。