我如何使用槽和信号从我的loginDialog类传递到我的配置文件类的变量



我进退两难。我一直在尝试使用插槽和信号从我的登录对话框类传递数据到配置文件类。连接工作,但它传递的是空字符串而不是变量。我已经试了好几个小时了,真的需要一些帮助。

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接收一个值,我已经确认这很好。

编辑:我已经包括了所有的登录和个人资料以及标题

如果可以的话,不要在新的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; });

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的值并将其传递给信号,因此我们知道它在那里是非空的。

我觉得你需要阅读更多关于信号和插槽的信息,连接只将你的信号连接到一个方法,它不发出信号,我认为你误解了connect的工作原理,因为你在测试retrieved_accountType之后。