QT 中直接修改方式修改一个widget对象中定义的共有成员变量无法修改,求解答
    本人是刚刚接触Qt不久的小菜鸡,弄了一个简单地操作数据库的程序,其中登录需要根据不同角色显示不同的窗口,并把登录账号作为参数传递到子窗口(因为后面我打算设计一个修改密码的功能),我的思路是:创建两个Qt设计师界面类的对象:Login和Customer,Login作登录窗口,其中定义客户窗口Customer c;而在Customer中我定义一个int型的公有成员变量ID,用来存储当前登录的用户ID(就是登录账号);登录窗口的登录按钮的槽函数会根据选择的角色以及输入的账号和密码是否正确来选择显示相应的操作界面(在这里我仅仅做了客户的),然后将成功登录时使用的ID,直接赋值给c.ID,然后关闭登录界面。
    但是在我的试验中,我想把这个值显示在一个标签中,却在c窗口中显示是一个随机数,而我直接用c.ID=500,得到的结果依然是标签中显示的还是一个随机数,这也就意味着**我直接给公有成员变量赋值的语句根本没有起作用**,这是为什么,我又该怎么解决这个问题。我的数据库链接是成功的,而且登录功能已经能够实现。最关键的是**这个是可以通过编译,只是运行时无法达到功能**

以下是我的部分代码(主函数和连接数据库的文件我就不发了):

 #ifndef LOGIN_H
#define LOGIN_H

#include <QWidget>
#include <customer.h>

namespace Ui {
class Login;
}

class Login : public QWidget
{
    Q_OBJECT

public:
    explicit Login(QWidget *parent = 0);
    ~Login();

private slots:
    void on_pushButton_clicked();

private:
    Ui::Login *ui;
    Customer c;
};

#endif // LOGIN_H


#include "login.h"
#include "ui_login.h"
#include <QMessageBox>
#include <QSql>
#include <QSqlQuery>

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

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

void Login::on_pushButton_clicked()
{
    if(ui->comboBox->currentText()==tr("请选择登录角色"))
    {
        QMessageBox::critical(0,tr("登录失败"),tr("请选择正确的登录角色"),QMessageBox::Cancel);
    }


    if(ui->comboBox->currentText()==tr("超级管理员登录"))
    {
        QSqlQuery query;
        bool suc=false;
        query.exec("SELECT * FROM Administrator");
        while(query.next())
        {
            if((query.value(0).toString()==ui->AdminEdit->text())&&(query.value(1).toString()==ui->PasswordEdit->text()))
            {
                QMessageBox::information(0,tr("登陆成功"),tr("超级管理员:%1 登陆成功").arg(query.value(0).toString()));
                this->close();
                suc=true;
                break;
            }
        }
        if(!suc)
            QMessageBox::critical(0,tr("登录失败"),tr("账号或密码错误"),QMessageBox::Cancel);
    }


    if(ui->comboBox->currentText()==tr("调度管理员登录"))
    {
        QSqlQuery query;
        bool suc=false;
        query.exec("SELECT * FROM Dispatcher");
        while(query.next())
        {
            if((query.value(0).toString()==ui->AdminEdit->text())&&(query.value(1).toString()==ui->PasswordEdit->text()))
            {
                QMessageBox::information(0,tr("登陆成功"),tr("调度管理员:%1 登陆成功").arg(query.value(2).toString()));
                this->close();
                suc=true;
                break;
            }
        }
        if(!suc)
            QMessageBox::critical(0,tr("登录失败"),tr("账号或密码错误"),QMessageBox::Cancel);
    }


    if(ui->comboBox->currentText()==tr("车队管理员登录"))
    {
        QSqlQuery query;
        bool suc=false;
        query.exec("SELECT * FROM Manager");
        while(query.next())
        {
            if((query.value(0).toString()==ui->AdminEdit->text())&&(query.value(1).toString()==ui->PasswordEdit->text()))
            {
                QMessageBox::information(0,tr("登陆成功"),tr("车队管理员:%1 登陆成功").arg(query.value(2).toString()));
                this->close();
                suc=true;
                break;
            }
        }
        if(!suc)
            QMessageBox::critical(0,tr("登录失败"),tr("账号或密码错误"),QMessageBox::Cancel);
    }

[color=#FF0000]//仅试验了客户这一块,出现了问题
    if(ui->comboBox->currentText()==tr("客户登录"))
    {
        QSqlQuery query;
        bool suc=false;
        query.exec("SELECT * FROM Customers");
        while(query.next())
        {
            if((query.value(0).toString()==ui->AdminEdit->text())&&(query.value(1).toString()==ui->PasswordEdit->text()))
            {
                QMessageBox::information(0,tr("登陆成功"),tr("客户:%1 登陆成功").arg(query.value(2).toString()));
                this->close();
                //c.ID=query.value(0).toInt();   
                c.ID=10000;
                suc=true;
                break;
            }
        }
        if(suc)
           {
                c.show();
           }
        else
            QMessageBox::critical(0,tr("登录失败"),tr("账号或密码错误"),QMessageBox::Cancel);
    }
}
//Login.cpp


#ifndef CUSTOMER_H
#define CUSTOMER_H

#include <QWidget>

namespace Ui {
class Customer;
}

class Customer : public QWidget
{
    Q_OBJECT

public:
    int ID;
    explicit Customer(QWidget *parent = 0);
    ~Customer();

private:
    Ui::Customer *ui;
};

#endif // CUSTOMER_H


#include "customer.h"
#include "ui_customer.h"

Customer::Customer(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Customer)
{
    ui->setupUi(this);
    ui->label->setText(tr("当前ID:%1").arg(ID));
}

Customer::~Customer()
{
    delete ui;
}
//Customer.cpp

多谢大神帮助,感激不尽

1个回答

Customer::Customer(QWidget *parent) :
QWidget(parent),
ui(new Ui::Customer)
{
ui->setupUi(this);
ui->label->setText(tr("当前ID:%1").arg(ID));
}
你在构造函数给他值,他能得到?
你应该在 c.ID=10000后; 在调用 ui->label->setText(tr("当前ID:%1").arg(ID));他就可以了

不过说实话,你c++基础需要加强了

CrazyKeyboardMan
数据刘 我自己解决了,定义了一个接口函数,多谢了。
接近 3 年之前 回复
CrazyKeyboardMan
数据刘 还有一个问题。。。。就是我这样改了之后,这里的ui指的是Login::ui,我的本意,这个ui是Customer::ui,这里我不会处理了。。。
接近 3 年之前 回复
CrazyKeyboardMan
数据刘 一语中的,的确需要多多练习了。
接近 3 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!