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

多谢大神帮助,感激不尽

0

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

1
CrazyKeyboardMan
数据刘 我自己解决了,定义了一个接口函数,多谢了。
2 年多之前 回复
CrazyKeyboardMan
数据刘 还有一个问题。。。。就是我这样改了之后,这里的ui指的是Login::ui,我的本意,这个ui是Customer::ui,这里我不会处理了。。。
2 年多之前 回复
CrazyKeyboardMan
数据刘 一语中的,的确需要多多练习了。
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
C++中修改const成员变量
1.c++类中定义const成员的时候必须进行初始化,而且只能通过初始化列表来进行 所以说类中存在const成员时,必须存在构造函数。当类中同时存在拷贝构造函数时也必须通过初始化列表将其初始化,否则编译器会报错n2.c++类中提供的const成员变量为只读变量,所以说我们可以通过一定的方式改变它n那么我们可以通过什么方式来改变cons成员呢?nn1.C++ 中提供了const_cast强制
C++修改类成员变量的几种方式
1、在类的成员函数中修改nn2、在类外部直接修改(限于public类型成员变量)nn3、在类外部通过指针或引用的方式获取成员变量,然后再修改
C++如何在const函数修改成员变量的值
C++如何在const函数修改成员变量的值在C++,总所周知,c++不允许在const函数直接修改成员变量的值,想要达到此目的,有两种方式:n使用mutable关键字n造一个假的this去操作成员变量n1.第一种方法很简单,只需要在成员变量前加mutable即可。2.第二种方式,就是造一个const pointer指向this所指对象,然后用这个指针去操作想要修改的成员变量,示例代码和解释如下:cl
iOS笔记—对象的结构体属性单个修改方式
 nnObjective-C语法规定,对象的结构体属性不能单个修改。如果是单独定义的结构体属性则可以单个修改。如象的结构体属性:nn nnnself.view.frame.size.width = 10;// 编译器报错&quot;expression is not assignable&quot;nn nn如单独定义的结构体属性:nn nnnCGSize mySize;nmySize.width = 9; // 不...
const成员函数修改成员变量的问题
class CTextBlock{npublic:n std::size_t length() const;nprivate:n char *pText;n std::size_t textLength;n bool lengthIsValid;n};nnstd::size_t CTextBlock::length()constn{n if (!lengthIsValid)n {n textLe
用Qt Designer创建ui后,记得修改objectName
否则生成的ui_xxx.h中的类名会与.h中的不一致
C/C++—— 除了用类成员函数访问类私有成员变量外,还可以通过类对象地址来直接访问和修改类的私有成员变量
除了用类成员函数访问类私有成员变量外,还可以通过类对象地址来直接访问和修改类的私有成员变量
修改指针指向的QVector内部成员的值
指针容器改变内部元素的值
JNI:在c代码中获得和直接修改java的string成员变量的值
jni c和java交互中,大部分数据类型都有对应,java中的string类型比较特殊,所以要用object。 njava代码 StringTest1.javanpublic class StringTest1 {n public String s = new String("java string");n //声明c方法n public native void displ
springMVC 谨慎使用成员变量
1.springMVC默认是单例的rn对于同一个Controller,只会生成一个实例来处理所有的请求,因此bean实例只会实例化一次,并被存放在工厂中,以供其他请求使用。rnrn在不定义成员变量的情况下是线程安全的。rn单例的优点:rn   1)每次请求不需要重新new一个对象。rn   2)垃圾收集和回收时更有效率。rnStruts2是类级别的,需要原型实现;rnSpringMVC是方法级的,
C++中常量成员函数
可以将C++中类的成员函数声明为常量,这种成员函数叫做常量成员函数(const member function)。nn1 声明nn将const关键字放在类成员函数的参数列表之后,表示该函数为常量成员函数。nnnclass MyClassnn{nnpublic:nnint consFunc() const;nnprivate:nnint m_MyNum;nn};nn2 定义nn可以在类内定义cons...
Java反射机制修改私有成员变量的实现_Reflection
Java反射机制修改私有成员变量的实现_Reflection,普通方式无法修改私有成员变量的值,但通过反射机制可以实现。
C++中对私有成员变量进行赋值
c++类成员的访问属性可以分为三种,分别是:公共成员(public),私有成员(private),受保护成员(protected)。在类对象的作用域内,公共成员在类的外部是可访问的。私有成员和受保护成员则不可以直接访问。下面一个小例子,使用公有成员函数对私有成员进行赋值:class examplen{npublic:n int a;n int set(int b)n {n return c = ...
在多线程中,A类有一个静态成员变量,如果A类在运行期间修改了它,B类是否能知道
     可以通过static关键字修饰成员变量,static表示的意思是该成员变量为类所拥有,并不是某一具体对象所拥有,通过该类实例化的所有对象共享static修饰的成员变量,static修饰的成员变量在内存中占有一块固定的内存,所以,你可以在A中修改staitc修饰的成员变量,在B中可以看到修改的结果。如果成员变量不定义为static,那么每当你new一次,相当于给该成员变量分配一次内存,所以...
2017.2.22 多线程访问成员变量造成的问题及改正
多线程访问成员变量造成的问题及改正rn参考资料:rnhttp://blog.csdn.net/gaogaoshan/article/details/23910355rnhttp://blog.csdn.net/gaogaoshan/article/details/9312703rn rn1 项目中的问题rn项目中出现了一个问题,当多个线程访问时,AuthPermissionResolver出现了多
创建一个类,在不改变类中代码的情况下,可创建任意类的对象并且执行任意方法
##在不改变类中代码的情况下,我首先想到的是采用配置文件的方式,写入我们需要创建的对象和执行的方法。n#配置文件名:prop.propertiesnClassName=PersonnMethodName=sleep```nn##代码块如下nnpublic class ReflectTest {npublic static void main(String[] args) throws Except...
C++ Protected 成员变量 也可以被外部修改
C++ Protected 成员变量 也可以被外部修改在有些开发过程中,第三方API并不是很完善,有些东西也需要我们自己修改,但一般就是修改一些参数,修改代码会带来一些新的bug。 n修改参数的目的可能就是,调用一些API程序员已经写好但是不想暴露给你的接口,WAHT EVER , WE DO JUST WE WANT, THIS IS PROGRAMER.this is a example of
iOS_Runtime修改变量值,交换方法实现,动态添加类,成员变量和方法
Runtime修改变量值,交换方法实现,动态添加类,成员变量和方法
Kotlin学习笔记:变量和属性
在Kotlin中,一切都是对象。没有像Java中那样的原始基本类型。这个是非常有帮 助的,因为我们可以使用一致的方式来处理所有的可用的类型。基本类型数字类型不支持自动转型val i : Int = 7nval d : Double = i.toDouble()字符(Char)不能作为数字直接处理nval c : Char = 'c'nval i : Int = c.toInt()位运算使用&quot;and...
为什么结构体/类中,成员变量可以初始化不可以赋值?
类内部成员的初始化rnrn在C++98标准里,只有static const声明的整型成员能在类内部初始化,并且初始化值必须是常量表达式。这些限制确保了初始化操作可以在编译时期进行。例如:rn int var = 7;n class X {n static const int m1 = 7; // 正确n const int m2 = 7; // 错
const定义的对象属性是否可以改变
    在作业盒子面试的时候问到了一个问题,const定义的对象属性是否可以改变。当时没有考虑就回答了不可以,面试官微笑着回答说错了。回来后查看了一下const的定义,明白了其中的原理。    const是用来定义常量的,而且定义的时候必须初始化,且定义后不可以修改。对于基本类型的数据来说,自然很好理解了,例如 const PI = 3.14。如果定义的时候不初始化值的话就会报错,错误内容就是没有...
js 面向对象(二) 对象的公有变量和私有变量
es 5中可以用立即函数来表示,表示过程有点儿像js模块化。举例:var foo=(function module(id){ var name=&quot;liao&quot;; var sex; var id=id; function getname(){ return name; } function setname(name){ this.name...
QT UI界面更改后,运行后显示出来的却没有更改
很多人说的是是工程目录下的文件没及时更新nn需要nn1.找到project构建的目录,复制ui_XX.h  nn2.找到.pro的目录(工程文件存放处),覆盖ui_XX.hnn3.运行 nn我发现只要把自己构建的目录指定到当前工程位置就可以,不需要上诉这样复杂操作,每次改动都去复制。nn产生的原因是你更改后的UI,产生的UI_XX.h文件并没有在你当前工程下,当前工程运行时无法获取你改动后的那个U...
Qt--02:设置父对象
问题引入:在Widget中创建Button等控件时,如果不指定Button等控件的父对象,就会产生相关控件无法再此Widget窗口中显示。因此当一些控件需要在当前Widget窗口中显示的时候就需要为控件添加父对象。n指定父对象方式 nsetParent(&w)n通过构造函数传参 n Note:指定父对象之后,父对象显示,子对象将自动显示n n代码展示int main(int argc, char
Qt使用全局变量
1、在项目的某个头文件中声明全局变量,如msdn.h: nnextern QString csdn;nextern QString qter;nn2、在main.cpp中将全局变量实例化,此后不需要再次实例化 nnQString csdn;nQString qter;nn3、其他文件(如qtcn.cpp)需要使用全局变量,只需要包含声明该全局变量的头文件即可: n如qtcn.cpp中:nn#i...
java:面向对象(给成员变量赋值的二种方法和区别)
n* A:setXxx()方法n * 修改属性值n* B:构造方法n * 给对象中属性进行初始化npublic class Demo07 {n public static void main(String[]args){nn person p1=new person(&quot;张三&quot;,24);n// p1=new person(&quot;李四&quot;,24)...
Qt 5.9解决界面修改控件名称不生效的问题
Qt 5.9解决界面修改控件名称不生效的问题rnrn一、版本说明:rnrnQt Creator 4.4.1 Based on Qt5.9.3 (MSVC 2015, 32bit)rnrn二、问题描述:rnrn如图,我在界面将Label控件名称从“shiduLb”更改为“aqiLb”,然后去代码里,“ui->aqi”并没有弹出“aqiLb”,一个一个往下找,也并没有找到“aqiLb”这一项,“Ctr
Java中ThreadLocal,成员变量和局部变量。
一.成员变量和局部变量nn1.程序例子:nnnpublic class HelloThreadTestn{n public static void main(String[] args)n {n HelloThread r = new HelloThread();nn Thread t1 = new Thread(r);n Thread t2 ...
php 给对象私有及受保护的成员变量赋值的几种方法
1.构造方法赋值rn<?phpnclass City{n private $_cityName;n private $_population;n n //function city($_cityName,$_population){} php5.3.3起在有命名空间的类中,类同名方法不再视为构造方法而是常规方法,无命名空间类中不影响n public function __construct($_
Qlist赋值问题
QList list;n list.append("item1");n list.append("item2");n list.append("item3");n list.append("item4");nn for(int i=0; i<list.size(); i+=1)n {n qDebug()<<""<<list.at(i);n }
使用友元函数实现用外部函数修改类内的私有数据成员
// lianxi4.1.cpp : 定义控制台应用程序的入口点。n//nn#include "stdafx.h"n#includenusing namespace std;nnclass ClassAddn{nprivate:n int x;n int y;npublic:n friend int ModifyMember(ClassAdd &Ca,int a,int b);//定义友元函数时注
Python中的类变量在子父类中被修改时引起的变化
运行结果是:rnrnrnrnrn# -*- coding: utf-8 -*-n"""nCreated on Thu Dec 7 20:29:58 2017nn@author: Administratorn"""nnclass Parent( object):n x = 1n nclass Child1( Parent):n passnnclass Child2( Paren
QT中控制Widget窗体大小方法
首先纠正一下QT的正确读法是“Q特”,不是“Q替”,个人认为这个问题还是比较重要的,就想C#不喜欢被人读成“C井”一样。言归正传,很多时候在写窗体的时候为了方便都会通过代码去控制窗体大小,这里就说说控制窗体的函数,虽然这是个比较简单的问题,但对我这种菜鸟级小白,还是在这里遇到了坑。QWidget *w=new QWidget;1、setBaseSize函数在定义了上面的函数后,通过w-&amp;gt;能调...
类成员变量和局部成员变量初始值设置问题
类成员变量:nn 1 class Person{n 2 private String name;//private final String name;n 3 private int age;n 4 public String getName() {n 5 return name;n 6 }n 7 public void setName(
react 修改state为对象中的某一个属性值
针对state为对象,想要修改对象中某一个值而不修改其他值,请欣赏接下来的方法 n1.设置state对象nnstate={n datavalue:{n slid:'',n name:'',n memo:'',n version:'',n icon:defaultimg,n loginlink:'',n key:'',n ...
JNI通过java class参数修改该类中String类型的成员变量
举例说明JNI如何通过java class参数修改该类中String类型的成员变量,如下所示array为Test类的一个成员变量,类型是double数组。npublic class Test {n String array;n Test() {n }n}nn调用JNI接口对应如下,参数是Test类的一个实例:npublic native void setTestArray(Tes...
QT更改窗口名称
-
vuex直接赋值的三种方法
我们在编写vuex代码过程中,觉得在a.vue的模板里面写入例如 {{$store.state.num}}很麻烦,我们希望直接就写成{{num}},我们应该怎么写,vue给出三种固定写法,大家理解之后基本照抄,稍做改动即可rnrnrn第一种方法 通过computed的计算属性直接赋值rnrn1.store.js(vuex的代码如下):rnrnrnrnimport Vue from 'vue'rnr
Java类中成员变量和成员方法的访问权限
Java访问权限的修饰符public,private,protected,缺省(default)一个类中的成员变量和成员方法(非静态)被访问分为两种场景,一是在该类中,或其子类中访问,二是创建该类的对象进行访问。假设:有三个类  class A ,class B extends C,class C     一、在类中访问首先,在B类中,可以访问到B类中定义的任意权限的成员变量/方法。然后C类中哪些...
利用JAVA反射,动态给某个对象实体的某个成员变量赋值或者获取某个成员变量的值
import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.util.Date;import cn.hutool.core.date.DateUtil;/** * 动态的给某个实体对象的某个属性赋值  或者 ...
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 数据库中修改课程名称 数据库中修改课程名称