数据刘 2016-11-28 13:25 采纳率: 100%
浏览 2363
已采纳

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条回答

  • weichangxiang 2016-11-28 15:08
    关注

    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++基础需要加强了

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?
  • ¥15 乘性高斯噪声在深度学习网络中的应用
  • ¥15 运筹学排序问题中的在线排序
  • ¥15 关于docker部署flink集成hadoop的yarn,请教个问题 flink启动yarn-session.sh连不上hadoop,这个整了好几天一直不行,求帮忙看一下怎么解决
  • ¥30 求一段fortran代码用IVF编译运行的结果
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛