【问题标题】:Qt emit signal from a class to classQt 从一个类到另一个类发出信号
【发布时间】:2017-02-17 11:41:39
【问题描述】:

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

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;
};

主窗口.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

主窗口.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);
}

【问题讨论】:

  • 这可能会有所帮助:stackoverflow.com/q/26422154/1421332
  • 我已经读过了。检查了一切(我相信),问题仍然存在。我读过一些人询问我面临的完全相同的问题,但没有得到适当的解决方案。这就是为什么我决定再次询问希望能帮助其他人的原因..
  • 您应该检查代码中的 connect() 返回值。 loginButtonClicked() 定义也缺少类名。
  • 正如我的帖子中所述,连接返回 true。发射 login() 被触发,但 slot 函数没有被调用。 loginButtonClicked() 类名定义只是一个错字。我会编辑它。
  • 你确定 SafeboxManager 没有被销毁而 LoginManager 没有被销毁吗?检查生命周期。

标签: c++ qt qt-signals slots


【解决方案1】:

SafeboxManager 和 LoginManager 对象必须存在足够长的时间。检查生命周期。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-17
  • 2020-10-18
  • 1970-01-01
  • 1970-01-01
  • 2012-11-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多