c++ 如何使用槽和信号将变量从loginDialog类传递到profile类

jobtbby3  于 2023-04-08  发布在  其他
关注(0)|答案(2)|浏览(87)

我遇到了一个难题。我一直在尝试使用插槽和信号将数据从我的登录对话框类传递到配置文件类。连接工作,但它传递的是一个空字符串而不是变量。我已经尝试了几个小时,真的很想得到一些帮助。
logindialog.h

#ifndef LOGINDIALOG_H
#define LOGINDIALOG_H

#include <QDialog>
#include <QWidget>

namespace Ui {
class LoginDialog;
};

class LoginDialog : public QDialog
{
    Q_OBJECT

public:
    explicit LoginDialog(QWidget *parent = nullptr);
    ~LoginDialog();

signals:
    void accountTypeToProfile(QString accType);

private slots:
    void on_Login_pushButton_clicked();

private:
    Ui::LoginDialog *ui;
};

#endif // LOGINDIALOG_H

profile.h

#ifndef PROFILE_H
#define PROFILE_H

#include <QDialog>
#include "logindialog.h"
#include <QMess

namespace Ui {
class profile;
}

class profile : public QDialog
{
    Q_OBJECT

public:
    explicit profile(QWidget *parent = nullptr);
    ~profile();

public slots:
    void retrieve_accType(QString);
    void on_profile__back_clicked();

private:
    Ui::profile *ui;
    QString retrieved_accountType;
    LoginDialog *loginDialogPtr = new LoginDialog();
};

#endif // PROFILE_H

logindialog.cpp

#include "logindialog.h"
#include "ui_logindialog.h"
#include <QDialog>

LoginDialog::LoginDialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::LoginDialog)
{
    ui->setupUi(this);
}

LoginDialog::~LoginDialog()
{
    delete ui;
}

void LoginDialog::on_Login_pushButton_clicked()
{
    QString account_type = "Transportation Company";

    emit accountTypeToProfile(account_type);
}

profile.cpp

#include "profile.h"
#include "ui_profile.h"
#include "logindialog.h"

profile::profile(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::profile)
{
    ui->setupUi(this);

    connect(loginDialogPtr, &LoginDialog::accountTypeToProfile, this,
            &profile::retrieve_accType);

    qDebug()<<retrieved_accountType;
}

profile::~profile()
{
    delete ui;

}

void profile::retrieve_accType(QString accType)
{
    retrieved_accountType = accType;
    //qDebug()<<retrieved_accountType;
}

void profile::on_profile__back_clicked()
{
    loginDialogPtr->show();
}

我以为我做得对,但从结果来看,我可能不是。谢谢你的帮助!
我有两个变量从登录对话框,accountTypeusername。我希望这两个变量传递到配置文件变量,这样我就可以在该类中使用它们。我很可能会将它们保存到配置文件类的变量中。
编辑:我已经包括了更多的loginDialog.cpp在此之前,它收到了一个值从lineEdit,我已经确认这工程罚款。
编辑:我已经包括了所有的登录和配置文件以及标题

hgqdbh6s

hgqdbh6s1#

如果可以的话,不要在新的Qt代码中使用SIGNAL和SLOT。
在现代Qt中,你的代码变成了:

connect(loginDialogPtr, &LoginDialog::usernameToProfile, this,
  [=](const QString& username) { retrieved_username = username; });
connect(loginDialogPtr, &LoginDialog::accountTypeToProfile, this,
  [=](const QString& accType) { retrieved_accountType = accType; });
wlzqhblo

wlzqhblo2#

Botje反复问你的是你似乎在用这行做什么:

qDebug() << retrieved_accountType;

profile.cpp中,在用户看到对话框之前,您正在检查profile构造函数中是否有数据,如果您将该行放在:

void retrieve_username(QString username)

如下:

void profile::retrieve_accType(QString accType)
{
    retrieved_accountType = accType;
    //both qDebugs will print "Transportation Company" when 
    //Login_pushButton is clicked
    qDebug()<<accType;
    qDebug()<<retrieved_accountType;
}

你会看到它工作得很好,就像Botje说了很多次一样
这是不可能的,因为我们显式地测试account_type的值,并将其传递给信号,这样我们就知道它在那里是非空的。
我觉得你需要阅读更多关于signals and slots和connect的内容,它只将你的信号连接到一个方法,它不发出信号,我想你误解了connect的工作原理,因为你在测试retrieved_accountType之后。

旁注

这里有一个minimal reproducible example,在这里你可以删除所有对你的问题不必要的东西,在你的情况下(一个数据库,一个未知的userform,一个组合框,一个QMessageBox ...)。

配置文件.h

#ifndef PROFILE_H
#define PROFILE_H

#include <QDialog>
#include "logindialog.h"
#include <QMess

namespace Ui {
class profile;
}

class profile : public QDialog
{
    Q_OBJECT

public:
    explicit profile(QWidget *parent = nullptr);
    ~profile();

public slots:
    void retrieve_accType(QString);
    void on_profile__back_clicked();

private:
    Ui::profile *ui;
    QString retrieved_accountType;
    LoginDialog *loginDialogPtr = new LoginDialog();
};

#endif // PROFILE_H

profile.cpp

#include "profile.h"
#include "ui_profile.h"
#include "logindialog.h"

profile::profile(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::profile)
{
    ui->setupUi(this);

    connect(loginDialogPtr, &LoginDialog::accountTypeToProfile, this,
            &profile::retrieve_accType);

    qDebug()<<retrieved_accountType;
}

profile::~profile()
{
    delete ui;

}

void profile::retrieve_accType(QString accType)
{
    retrieved_accountType = accType;
    //qDebug()<<retrieved_accountType;
}

void profile::on_profile__back_clicked()
{
    loginDialogPtr->show();
}

loginDialog.h

#ifndef LOGINDIALOG_H
#define LOGINDIALOG_H

#include <QDialog>
#include <QWidget>

namespace Ui {
class LoginDialog;
};

class LoginDialog : public QDialog
{
    Q_OBJECT

public:
    explicit LoginDialog(QWidget *parent = nullptr);
    ~LoginDialog();

signals:
    void accountTypeToProfile(QString accType);

private slots:
    void on_Login_pushButton_clicked();

private:
    Ui::LoginDialog *ui;
};

#endif // LOGINDIALOG_H

loginDialog.cpp

#include "logindialog.h"
#include "ui_logindialog.h"
#include <QDialog>

LoginDialog::LoginDialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::LoginDialog)
{
    ui->setupUi(this);
}

LoginDialog::~LoginDialog()
{
    delete ui;
}

void LoginDialog::on_Login_pushButton_clicked()
{
    QString account_type = "Transportation Company";

    emit accountTypeToProfile(account_type);
}

相关问题