本人是剛剛接觸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
多謝大神幫助,感激不盡
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++基礎需要加強了