Qt从一个类发出信号到另一个类

Qt emit signal from a class to class

本文关键字:另一个 信号 一个 Qt      更新时间:2023-10-16

我尝试从我的loginmanager类发出一个自定义信号login()到主窗口。信号在loginButtonClicked插槽上触发,根据我对信号/插槽机制的理解,它应该能够捕获任何信号触发的事件,并"查找"要执行的相应插槽。但它并不像我想的那样起作用。

连接函数返回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对象必须存在足够长的时间。查看使用寿命