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

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 07: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 分析照片像素时,怎样剔除照片背景像素
  • ¥15 Cytoscape导入问题
  • ¥15 关于#lstm#的问题:我想利用一个地方的四组数据来预测第五组数据,如果想预测出另外一个地方(只有前四组数据)的第五组数据(相关搜索:预测模型)
  • ¥15 windows窗口外边框分区是什么?(qt应用)
  • ¥15 使用lightgbm框架,对糖尿病趋势进行预测。
  • ¥30 给出MySQL数据库workbench代码
  • ¥15 文本挖掘法衡量保险公司数字化转型
  • ¥15 Direct2D,一个图像如何绘制到不同窗体?
  • ¥15 putimage函数输出了不属于指定路径的图片
  • ¥15 ros2运行代码出现问题
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部